1

我需要在我的代码中使用 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,那看起来很疯狂。有人知道吗?

4

2 回答 2

4

我注意到这个问题和@blorgggg 前一阵子的答案,并深深地怀疑,因为这个问题与频道有关,但答案与深度有关。


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

相关代码:

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

@luhb在线程中的陈述是正确的,因为它确实只支持深度为 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 中的代码片段。


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

于 2014-10-23T03:36:46.617 回答
0

另一个人在用户 luhb 回答的另一个问题中确定了这个问题的答案:Open CV using 16 bit signed format not working... 裁剪和调整图像大小

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

我深入研究了源代码并弄清楚了这一点。API 参考中没有规范。

于 2012-11-16T02:18:56.500 回答