【问题标题】:OpenCV : Transparent area of imported .png file is now whiteOpenCV:导入的 .png 文件的透明区域现在是白色的
【发布时间】:2014-11-16 18:22:12
【问题描述】:

我正在尝试开发一个小型且简单的网络摄像头控制游戏,其中用户通过使用网络摄像头(例如手电筒)跟踪光源来在 x 轴上移动图形

到目前为止,我的代码每隔几秒钟就会在图片中的随机位置生成一个目标对象。 该对象通过

存储为 Mat
Mat target = imread("target.png");

为了将对象绘制到背景图像上,我正在使用

bgClear.copyTo(temp);    
for(int i = targetX; i < target.cols + targetX; i++){
            for(int j = targetY; j < target.rows + targetY; j++){                               
                    temp.at<Vec3b>(j,i) = target.at<Vec3b>(j-targetY,i-targetX);                
            }
          } 
temp.copyTo(bg);

其中 bgClear 表示干净的背景,temp 表示正在编辑的背景副本,bg 表示最终显示的背景。
targetXtargetY 是对象的起始坐标(而 targetX 是预先随机生成的,因此对象在上部随机位置生成)图像的一半),相对于背景。 (所以我没有遍历整个背景,只遍历对象的范围)。

到目前为止它工作正常,但我有一个问题: 导入图像的透明区域现在是白色,我似乎无法通过检查像素值来修复它

       if(target.at<Vec3b>(Point(j-targetY,i-targetX))[0] != 255 &&
       target.at<Vec3b>(Point(j-targetY,i-targetX))[1] != 255 &&
       target.at<Vec3b>(Point(j-targetY,i-targetX))[2] != 255)

在我实际替换像素之前。

我还尝试通过添加 -1 标志(alpha 通道) 来加载 .png 文件,但是图像看起来很模糊,几乎看不到。

如果您对我所说的内容有疑问,这里是它的部分截图:Screenshot

关于如何解决这个问题的任何建议?

问候, 丹尼尔

【问题讨论】:

    标签: image opencv png transparency alpha


    【解决方案1】:

    您需要手动处理透明度。一般的想法是,在复制到 temp 时,只复制不透明的像素,即 alpha 值很高。

    1. imread 中使用CV_LOAD_IMAGE_UNCHANGED (= -1)。
    2. 使用splittarget拆分为四个单通道图像。
    3. 使用merge合并前三个通道以形成BGR图像。
    4. 在绘制循环中,使用新形成的 BGR 图像作为源,使用未合并的第四通道 (alpha) 作为遮罩。

    【讨论】:

    • 非常感谢您的回复;我对 OpenCV 对数组的操作进行了更多研究,并通过使用 mixChannels 函数找到了另一种解决方案:
    【解决方案2】:

    ...正如我在对 asif 的有用答案的评论中提到的那样:

    Mat target = imread("target", CV_LOAD_IMAGE_UNCHANGED); // load image
    Mat targetBGR(target.rows, target.cols, CV_8UC3);       // create BGR mat
    Mat targetAlpha(target.rows, target.cols, CV_8UC1);     // create alpha mat
    Mat out[] = {targetBGR, targetAlpha};                   // create array of matrices
    int from_to[] = { 0,0, 1,1, 2,2, 3,3 };                 // create array of index pairs 
    mixChannels( &target, 1, out, 2, from_to, 4 );          // finally split target into 3 
                                                            channel BGR plus 1 channel Alpha
    

    ...如example 中所述。 (减去 R-B 通道交换)。

    ...later in the pixel-processing loop:
    
      if(targetAlpha.at<uchar>(j-targetY,i-targetX) > 0)
                        temp.at<Vec3b>(j,i) = targetBGR.at<Vec3b>(j-targetY,i-targetX); 
    

    像魅力一样工作!

    【讨论】:

      猜你喜欢
      • 2013-10-24
      • 1970-01-01
      • 2018-07-26
      • 2015-09-05
      • 2012-06-08
      • 1970-01-01
      • 2022-01-04
      • 2015-07-11
      • 2019-05-12
      相关资源
      最近更新 更多