Bootstrap

opencv getRectSubPix()函数报错问题解决

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)是否正确,头文件中并未明确指出输入输出图像的格式要求。以后碰到类似报错问题还是要尽量查看源码!

希望能帮到同样遇到该问题的小伙伴!

;