问题描述
希望有人能帮我解决这个问题.. 我正在创建一个 android 应用程序,它应该打开相机,检测矩形形状并提取检测到的形状以进行进一步的图像处理和分析。基本上类似于这个线程:
how to extract an object from the camera preview android opencv
我也遇到了应该停止相机预览并返回检测到的形状(矩形)的问题。有没有人可以给我一些关于如何做到这一点的指导?
到目前为止我的代码:
private Mat mHold = new Mat();
private Mat mRGB = new Mat();
private Mat mRGBF = new Mat();
private List<MatOfPoint> contours;
public MainActivity() {
Log.i(TAG,"Instantiated new " + this.getClass());
}
public void onCreate(Bundle savedInstanceState) {
Log.i(TAG,"called onCreate");
super.onCreate(savedInstanceState);
requestwindowFeature(Window.FEATURE_NO_TITLE);
getwindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setContentView(R.layout.activity_main);
mOpenCvCameraview = (CameraBridgeView) findViewById(R.id.my_camera_view);
mOpenCvCameraview.setMaxFrameSize(720,1280);
mOpenCvCameraview.setVisibility(SurfaceView.VISIBLE);
mOpenCvCameraview.setCvCameraviewListener(this);
}
@Override
public void onPause()
{
super.onPause();
if (mOpenCvCameraview != null)
mOpenCvCameraview.disableView();
}
public void onResume()
{
super.onResume();
if (!OpenCVLoader.initDebug()) {
Log.d("OpenCV","Internal OpenCV library not found. Using OpenCV Manager for initialization");
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION,this,mloaderCallback);
} else {
Log.d("OpenCV","OpenCV library found inside package. Using it!");
mloaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}
}
public void onDestroy() {
super.onDestroy();
if (mOpenCvCameraview != null)
mOpenCvCameraview.disableView();
}
public void onCameraviewStarted(int width,int height) {
mRGB = new Mat(height,width,CvType.CV_8UC4);
contours = new ArrayList<>();
}
public void onCameraviewStopped() {
mRGB.release();
}
public Mat onCameraFrame(CvCameraviewFrame inputFrame)
{
contours.clear();
mRGB = inputFrame.rgba();
mRGBF = mRGB.t();
Core.flip(mRGB.t(),mRGBF,1);
Imgproc.resize(mRGBF,mRGB.size()); //normal picture
mHold = mRGB.t();
Core.flip(mRGB.t(),mHold,1);
Imgproc.resize(mHold,mRGB.size());
//image- processing:
Imgproc.cvtColor(mRGBF,Imgproc.COLOR_BGR2GRAY);
Imgproc.GaussianBlur(mRGBF,new org.opencv.core.Size(1,1),2,2);
Imgproc.Canny(mRGBF,50,50);
//Imgproc.erode(mRGBF,new Mat());
//Imgproc.dilate(mRGBF,new Mat());
Imgproc.findContours(mRGBF,contours,new Mat(),Imgproc.RETR_EXTERNAL,Imgproc.CHAIN_APPROX_SIMPLE);
Imgproc.drawContours(mHold,-1,new Scalar(255,0),2);
double maxArea = -1;
int maxAreaIdx = -1;
MatOfPoint temp_contour = contours.get(0);
MatOfPoint2f approxCurve = new MatOfPoint2f();
Mat largest_contour = contours.get(0);
List<MatOfPoint> largest_contours = new ArrayList<MatOfPoint>();
for (int idx = 0; idx < contours.size(); idx++) {
temp_contour = contours.get(idx);
double contourarea = Imgproc.contourArea(temp_contour);
//compare this contour to the prevIoUs largest contour found
if (contourarea > maxArea) {
//check if this contour is a square
MatOfPoint2f new_mat = new MatOfPoint2f(temp_contour.toArray());
int contourSize = (int)temp_contour.total();
Imgproc.approxpolyDP(new_mat,approxCurve,contourSize*0.05,true);
if (approxCurve.total() == 4) {
maxArea = contourarea;
maxAreaIdx = idx;
largest_contours.add(temp_contour);
largest_contour = temp_contour;
}
}
}
MatOfPoint temp_largest = largest_contours.get(largest_contours.size()-1);
largest_contours = new ArrayList<MatOfPoint>();
largest_contours.add(temp_largest);
Mat emptyMat = Mat.zeros(mHold.size(),mHold.channels());
Imgproc.drawContours(emptyMat,largest_contours,new Scalar(0,255,1);
返回 mHold;
基本上,onCameraFrame 返回突出显示所有轮廓的帧;现在我不太确定如何提取代表最大矩形的帧部分,从而终止预览。如您所见,我有一个想法,绘制一个 emptyMat 并将其转发到另一个活动,但它不起作用......我仍然不熟悉 android studio 的所有功能,因此非常感谢任何帮助。>
谢谢。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)