我正在开发一个应用程序,我必须从相机拍照,然后在图片中检测边缘广场(如文档页面。)...经过长时间的搜索,我发现OpenCV库来实现这一点,我已经成功导入了android的java库,但问题是当我调用opencv的方法来检测Square时(该方法是
Imgproc.findContours(转换,轮廓,层次结构,Imgproc.CHAIN_APPROX_SIMPLE,Imgproc.RETR_LIST))..它给了我
例外... OpenCV错误: _CvContourScanner * cvStartFindContours中无法支持的格式或格式组合(FindContours仅支持8uC1和32sC1图像)(void *,CvMemStorage *, int,int,int,CvPoint),file /home/reports/ci/slave/50-SDK/opencv/modules/imgproc/src/contours.cpp,196行
我发给你一些代码--------------------------------------- --------------
public void convertImage(){
Mat ori = new Mat();
Mat converted = new Mat(200, 200, CvType.CV_8UC1, new Scalar(0));
try {
ori = Utils.loadResource(MainActivity.this, R.drawable.ic_launcher, Highgui.CV_LOAD_IMAGE_COLOR);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Imgproc.cvtColor(ori, converted, Imgproc.COLOR_RGB2GRAY, 4); // convert Image to grayscale
Imgproc.threshold(ori, converted, 50, 250, Imgproc.ADAPTIVE_THRESH_MEAN_C); // threshold the image
List<MatOfPoint> contours = new ArrayList<MatOfPoint>(10);
Mat hierarchy = new Mat(200, 200, CvType.CV_32FC1, new Scalar(0));
Imgproc.findContours(converted, contours, hierarchy,Imgproc.CHAIN_APPROX_SIMPLE,Imgproc.RETR_LIST);
ImageView frame = (ImageView) findViewById(R.id.imageView1);
Imgproc.cvtColor(converted, converted, Imgproc.COLOR_GRAY2RGBA, 4); // convert Image back to RGB
Bitmap bmp = Bitmap.createBitmap(converted.cols(), converted.rows(), Bitmap.Config.ARGB_8888);
frame.setImageBitmap(bmp);
}
任何帮助都会被贬低------------------ 提前致谢
答案 0 :(得分:3)
在'cvFindCounters'中第一个参数是输入图像;此图像应为8位单通道图像,并将被解释为二进制。 所以,不应传递4通道图像,而应传递单个通道图像。
这应该适合你。
Imgproc.cvtColor(ori,转换后,Imgproc.COLOR_RGB2GRAY, 1 );
答案 1 :(得分:1)
尝试使用
Imgproc.cvtColor(ori, converted, Imgproc.COLOR_RGB2GRAY, 1);
Imgproc.cvtColor(converted, converted, Imgproc.COLOR_GRAY2RGBA, 1);
而不是
Imgproc.cvtColor(ori, converted, Imgproc.COLOR_RGB2GRAY, 4);
Imgproc.cvtColor(converted, converted, Imgproc.COLOR_GRAY2RGBA, 4);
因为您需要使用1个频道。
答案 2 :(得分:0)
首先将位图加载为 -
Bitmap icon = BitmapFactory.decodeResource(context.getResources(),
R.drawable.ic_launcher);
然后将位图转换为Mat -
Mat m = new Mat();
Utils.bitmapToMat(icon, m);
Imgproc.cvtColor(m, m, Imgproc.COLOR_RGB2GRAY, 1);
执行你的阈值和findcontours如上所述..基本思路是将Bitmap转换为Mat,这是单通道..