我使用下面的代码来查找图像的垫轮廓。我发现轮廓是正确的。但是当我尝试在轮廓处裁剪图像时,应用程序崩溃了。
List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Mat contour_mat = new Mat();
Imgproc.findContours(image, contours, contour_mat, Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_NONE);
Mat roi = null;
for (int idx = 0; idx < contours.size(); idx++) {
Mat contour = contours.get(idx);
double contourarea = Imgproc.contourArea(contour);
if(contourarea>10000){
Rect rect = Imgproc.boundingRect(contours.get(idx));
//to get my target contour
if (rect.height< 55){
Core.rectangle(hsv_image, new Point(rect.x,rect.y), new Point(rect.x+rect.width,rect.y+rect.height),new Scalar(0,0,255));
roi = hsv_image.submat(rect.y, rect.y + rect.height, rect.x, rect.x + rect.width);
}
}
}
Mat image = new Mat(roi.size(), CvType.CV_8UC1);
roi.copyTo(image);
Bitmap bm = Bitmap.createBitmap(image.rows(), image.cols(),
Bitmap.Config.ARGB_8888);
Utils.matToBitmap(image, bm);
这是错误日志:
05-08 20:07:56.851: E/AndroidRuntime(13331): CvException [org.opencv.core.CvException: /home/reports/ci/slave_desktop/50-SDK/opencv/modules/java/generator/src/cpp/utils.cpp:97: error: (-215) src.dims == 2 && info.height == (uint32_t)src.rows && info.width == (uint32_t)src.cols in function void Java_org_opencv_android_Utils_nMatToBitmap2(JNIEnv*, jclass, jlong, jobject, jboolean)
这里可能有一个问题:
Mat image = new Mat(bitmap.getWidth(), bitmap.getHeight(), CvType.CV_8UC1);
当你创建一个Mat
,参数是rows
, cols
,所以你应该这样做:
Mat image = new Mat(bitmap.getHeight(), bitmap.getWidth(), CvType.CV_8UC1);
但是,该错误意味着源图像和目标图像的大小不同。因此,注意roi.copyTo(image)
调用将调整image
的大小以匹配感兴趣的区域的大小,它可能与原始位图不匹配。
因此,要么您必须创建与ROI相同大小的位图,然后复制到该位图,要么您必须调整ROI的大小以匹配您的接收位图。
你可以这样做,以确保你知道使用什么大小的位图:
Mat image = new Mat(roi.size(), CvType.CV_8UC1);
// unsure of syntax for your platform here... but something like ...
Bitmap newBitmap = Bitmap.createBitmap(image.cols(), image.rows(),
Bitmap.Config.ARGB_8888);
// now copy the image
Utils.matToBitmap(image, newBitmap);