1.问题
- 版本: c++ opencv 3.0 (2.4系列同样适用)
- 平台: android6.0 c++ SDK 调用
在调用如下代码:
Mat img_crop;
getRectSubPix(img_rotated, rect_size, rect.center, img_crop);
报错:
E/cv::error(): OpenCV Error: Assertion failed (cn == 1 || cn == 3) in void cv::getRectSubPix(cv::InputArray
google了一圈,发现stackoverflow 上仁兄说明的问题是图像的深度问题,该函数只支持CV_8U 或者CV_32F格式的图像输入输出。
如下链接:
https://stackoverflow.com/questions/12048381/opencv-getrectsubpix-with-alpha-channel
在反复确认了我的输出图像格式CV_8U 正确后,还是报错。
遂在以下路径:
“\opencv\sources\modules\imgproc\src\samplers.cpp”:
查看该函数源码(部分):
void cv::getRectSubPix( InputArray _image, Size patchSize, Point2f center,
OutputArray _patch, int patchType )
{
Mat image = _image.getMat();
int depth = image.depth(), cn = image.channels();
int ddepth = patchType < 0 ? depth : CV_MAT_DEPTH(patchType);
CV_Assert( cn == 1 || cn == 3 ); // 该断言报错
发现我的报错真是由于CV_Assert函数引起,而cn = image.channels(); 果不其然,我输入的src是rgba四通道的,而该函数只接受3通道或者单通道图像输入。
2.解决
Mat src_rgb ;
cvtColor(src,src_rgb,CV_RGBA2RGB);
利用库函数cvtColor将图片格式转换为3通道,再当形参传入函数即可解决。
3. 总结
该函数的宝座,主要考虑输入、输出图像的深度(depth)、通道数(channel)是否正确,头文件中并未明确指出输入输出图像的格式要求。以后碰到类似报错问题还是要尽量查看源码!
希望能帮到同样遇到该问题的小伙伴!