报错:FindContours support only 8uC1 and 32sC1 images | Unsupported data type (=4) | opencv java开发

关于findcontours函数的具体参数介绍参见博客:Opencv 轮廓检测相关api文档

调用findcontours()方法时,所需的参数在python环境和java环境都是差不多的。
如果出现这个报错,就可以锁定为是输入参数的格式不是所需要的8uC1 或 32sC1。(可以看出这个方法只支持单通道图像)

先来看看这个函数需要的参数:

c++:
void findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset=Point())

这些参数具体的含义,以及可以选择的值,在上面博客中写得非常详细了,建议对照查看~

下面贴上我的代码:
(需要的准备工作:先把文件读入为Mat对象,命名为image)

java:
//1.首先要读取原图像为Mat格式,命名为image。这一步我自己写函数实现的,不好贴上来。你们调opencv的方法也可以。

//——————下面这些可以copy去用——————

//2.从二值图像提取轮廓
//创建contours对象,用于存储提取出来的轮廓
List<MatOfPoint> contours = new ArrayList<>();
//创建hierarchy
Mat hierarchy = new Mat();
//调用方法
Imgproc.findContours(image, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_NONE);
//以上,就把提取出的轮廓存入contours了

//3.绘制轮廓
//利用contours绘制轮廓,输出为文件
//设置背景色为黑色
Mat background = new Mat(image.size(), CvType.CV_8UC1, new Scalar(0));
//调用方法,设置轮廓线为[添加链接描述](https://www.cnblogs.com/long5683/p/10492180.html)白色(contourIdx=-1为绘制所有轮廓,thickness=4是线宽)
Imgproc.drawContours(background, contours, -1, new Scalar(255), 4);
Highgui.imwrite("C:\\data\\background.tif", background);

记录踩过的坑:
1.报错:FindContours support only 8uC1 and 32sC1 images。
我输入的图像格式是8UC1的,即无符号整型八位单通道格式,所以调用方法时,mode必须指定为RETR_EXTERNAL!!!(就是这个问题!我找了好久)
如果mode指定为CV_RETR_CCOMP 或者 CV_RETR_FLOODFILL,输入图像则需要是32位的整型图像,即CV_32SC1格式。

2.Unsupported data type (=4) .
这个意思是:你输入的数据类型(= 4)为CV_32SC1,该方法不支持,你需要将数据转换CV_8UC1后再使用。
参考回答:OpenCV Python error: Unsupported data type (=4) in function ‘cv::opt_AVX2::getMorphologyRowFilter’

3.绘制轮廓时也要注意前两个参数格式一致。
关于drawContours方法的参数介绍:OpenCV——轮廓填充drawContours函数解析

END

你可能感兴趣的:(opencv,java,图像处理)