带有Alpha通道的OpenCV getRectSubPix

时间:2012-08-21 04:18:06

标签: opencv alpha roi

我需要在代码中使用getRectSubPix函数,作为裁剪旋转图像部分的过程的一部分。这通常适用于3通道图像,但是当我尝试将它与BGRA或RGBA垫图像一起使用时,它会崩溃说给我

  

OpenCV错误:cvGetRectSubPix中不支持的格式或格式组合(),文件/home/biotracking/Downloads/OpenCV-2.4.2/modules/imgproc/src/samplers.cpp,第550行

我的代码基本上就像这样

                cv::cvtColor(polymask, polymask, CV_BGR2BGRA);
                getRectSubPix(polymask, cv::Size(sqrt(biggestdistancesquared)*2,sqrt(biggestdistancesquared)*2), src_center, polymask);

如果这个功能真的不适用于具有alpha通道的Mats,这看起来很疯狂。有人知道吗?

2 个答案:

答案 0 :(得分:2)

前一段时间我注意到这个问题和@blorgggg的答案,并且深表怀疑,因为问题与频道有关,但答案与深度有关


我的回答: 错误上升是因为getRectSubPix仅支持通道1或3的图像。

相关代码:

if( (cn != 1 && cn != 3) || !CV_ARE_CNS_EQ( src, dst ))
    CV_Error( CV_StsUnsupportedFormat, "" );

@luhb在线程here中的语句是真的,因为它确实只支持深度为8或32的图像,但与此处的问题无关。

相关代码:

if( CV_MAT_DEPTH( src->type ) != CV_8U || CV_MAT_DEPTH( dst->type ) != CV_32F )
            CV_Error( CV_StsUnsupportedFormat, "" );

我查看版本2.4 / 2.8 / 2.9中的代码段。


最后,为了解决您的麻烦,您可以先在每个频道上拆分Mat getRectSuxPix,然后合并四个频道。

答案 1 :(得分:0)

另一个人确定了这个问题的答案 在另一个问题中,用户luhb回答:Open CV using 16 bit signed format not working... Cropping and re-sizing an image

似乎getRectSubPix仅适用于{src,dst}类型的{CV_8U,CV_8U},{CV_32F,CV_32F}和{CV_8U,CV_32F}。

我深入了解源代码并想出来。 API参考中没有规范。