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

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值