我在Android App里对一张图片中的目标求外部轮廓;
使用void org.opencv.imgproc.Imgproc.findContours(Mat image, List<MatOfPoint> contours, Mat hierarchy, int mode, int method)
单每次都出现如下问题:
04-28 09:59:48.857: E/cv::error()(1095): OpenCV Error: Unsupported format or combination of formats ([Start]FindContours support only 8uC1 and 32sC1 images) in _CvContourScanner* cvStartFindContours(void*, CvMemStorage*, int, int, int, CvPoint), file /home/reports/ci/slave/50-SDK/opencv/modules/imgproc/src/contours.cpp, line 196
04-28 09:59:48.857: D/AndroidRuntime(1095): Shutting down VM
04-28 09:59:48.867: W/dalvikvm(1095): threadid=1: thread exiting with uncaught exception (group=0x409bd1f8)
04-28 09:59:48.867: E/AndroidRuntime(1095): FATAL EXCEPTION: main
04-28 09:59:48.867: E/AndroidRuntime(1095): CvException [org.opencv.core.CvException: /home/reports/ci/slave/50-SDK/opencv/modules/imgproc/src/contours.cpp:196: error: (-210) [Start]FindContours support only 8uC1 and 32sC1 images in function _CvContourScanner* cvStartFindContours(void*, CvMemStorage*, int, int, int, CvPoint)
04-28 09:59:48.867: E/AndroidRuntime(1095): ]
04-28 09:59:48.867: E/AndroidRuntime(1095): at org.opencv.imgproc.Imgproc.findContours_1(Native Method)
04-28 09:59:48.867: E/AndroidRuntime(1095): at org.opencv.imgproc.Imgproc.findContours(Imgproc.java:5500)
04-28 09:59:48.867: E/AndroidRuntime(1095): at com.example.imagematch.MainActivity$1.onManagerConnected(MainActivity.java:106)
04-28 09:59:48.867: E/AndroidRuntime(1095): at org.opencv.android.AsyncServiceHelper$1.onServiceConnected(AsyncServiceHelper.java:318)
04-28 09:59:48.867: E/AndroidRuntime(1095): at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1068)
04-28 09:59:48.867: E/AndroidRuntime(1095): at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1085)
04-28 09:59:48.867: E/AndroidRuntime(1095): at android.os.Handler.handleCallback(Handler.java:605)
04-28 09:59:48.867: E/AndroidRuntime(1095): at android.os.Handler.dispatchMessage(Handler.java:92)
04-28 09:59:48.867: E/AndroidRuntime(1095): at android.os.Looper.loop(Looper.java:137)
04-28 09:59:48.867: E/AndroidRuntime(1095): at android.app.ActivityThread.main(ActivityThread.java:4429)
根据提示,我把输入的Mat对象都转化成CvType.CV_32SC1类型还是不行:mat.convertTo(mat, CvType.CV_32SC1);
全部代码如下,求高手赐教,谢谢:
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:{
Log.i("MainActivity", "OpenCV loaded successfully");
Mat mat = new Mat();
Utils.bitmapToMat(mTemplateImage, mat);
//二值化
Imgproc.GaussianBlur(mat, mat, new Size(9,9), 10);
Imgproc.threshold(mat, mat, 128, 200,Imgproc.THRESH_BINARY);
mat.convertTo(mat, CvType.CV_32SC1);
ArrayList<MatOfPoint> contoursList = new ArrayList<MatOfPoint>();
Mat hierarchy = new Mat();
hierarchy.convertTo(hierarchy, CvType.CV_32SC1);
//定义轮廓抽取模式
int mode = Imgproc.RETR_EXTERNAL;
//定义轮廓识别方法
int method = Imgproc.CHAIN_APPROX_NONE;
//轮廓识别
Imgproc.findContours(mat, contoursList, hierarchy, mode, method);
if( contoursList != null && contoursList.size() > 0 ){
for( MatOfPoint matpoint : contoursList ){
org.opencv.core.Point[] points = matpoint.toArray();
for( org.opencv.core.Point point : points)
Log.i("MainActivity", "x="+point.x+",y="+point.y);
}
}
}
break;
default:{
super.onManagerConnected(status);
} break;
}
} |