带有 Alpha 通道的 OpenCV getRectSubPix

Posted

技术标签:

【中文标题】带有 Alpha 通道的 OpenCV getRectSubPix【英文标题】:OpenCV getRectSubPix with Alpha Channel 【发布时间】:2012-08-21 04:18:05 【问题描述】:

我需要在我的代码中使用 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,那真是太疯狂了。有人知道吗?

【问题讨论】:

【参考方案1】:

前段时间注意到这个问题和@blorgggg的回答,深感疑惑,因为这个问题和channels有关,而答案却和depth有关.


我的回答: 错误上升是因为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版本的代码sn-p。


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

【讨论】:

【参考方案2】:

另一个人回答了这个问题 在另一个问题中,用户 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 参考中没有规范。

【讨论】:

以上是关于带有 Alpha 通道的 OpenCV getRectSubPix的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python OpenCV 中读取 TIFF 图像的 alpha 通道?

具有alpha层的PNG图像上的OpenCV边缘检测

带有 alpha 通道部分的透明 PNG 显示带有丑陋的边框

JFrame 绘制带有 alpha 通道的动画 gif 图像

使用 FPDF (PHP) 插入带有 alpha 通道的 PNG

PS保存的PNG为啥有alpha通道