2011-11-07 63 views
0

我有透明图像[下面示出],我试图与aishack.in cvOverlayImage()函数来覆盖它,以在其上重合摄像机源叠加透明图像在相机的输出中的OpenCV

cvOverlayImage()

void cvOverlayImage(IplImage* src, IplImage* overlay, CvPoint location, CvScalar S, CvScalar D) 
    { 
    int x,y,i; 

     for(x=0;x < overlay->width -10;x++) 
     { 
      if(x+location.x>=src->width) continue; 
      for(y=0;y < overlay->height -10;y++) 
      { 
       if(y+location.y>=src->height) continue; 
       CvScalar source = cvGet2D(src, y+location.y, x+location.x); 
       CvScalar over = cvGet2D(overlay, y, x); 
       CvScalar merged; 
       for(i=0;i<4;i++) 
       merged.val[i] = (S.val[i]*source.val[i]+D.val[i]*over.val[i]); 
       cvSet2D(src, y+location.y, x+location.x, merged); 
      } 
     } 
    } 

调用cvOverlayImage()

cvOverlayImage(image_n, neg_img, cvPoint(0, 0), cvScalar(1.0,1.0,1.0,1.0), cvScalar(0.1,0.1,0.1,0.1)); 

输入到cvOverlayImage()

  1. 相机捕捉

Camera Capture

  • 负片图像
  • Negative Image

    从cvOverlayImage 10

    输出()

    Output

    正如你所看到的,我没有得到什么,我need.Please帮助我。

    +1

    如果你的问题是由于矩形造成图像破坏,你应该只覆盖不是白色的像素(如果背景为白色),否则你应该制作一个图像蒙版(可能是背景上方的阈值)然后完全覆盖这些像素,替换它们下面的像素。这应该会给出更好的结果:) – Adrian

    +0

    你是对的,但眼镜仍然会出现透明:) – Smash

    +0

    @Smash我没有得到你所评论的...你试过什么阿德里安波波维奇建议...请帮助代码if你通过它... – Wazzzy

    回答

    1

    这没有测试,但不应该S [i] + D [i] = 1来保持总强度?

    +0

    +1的回答。我试过,但没有工作。 – Wazzzy

    2

    我使用的一个解决方案是简单地检测白色存在的位置,在这些情况下只需使用源图片中的像素。否则,请使用叠加图片的像素。对于类似的情况,我工作得很好。另外,如果您加载的图片具有Alpha通道并可用作蒙版,那就更好了。

    void cvOverlayImage(IplImage* src, IplImage* overlay, CvPoint location, 
    CvScalar S, CvScalar D) 
    { 
    int x,y,i; 
    
        for(x=0;x < overlay->width;x++) 
        { 
         if(x+location.x>=src->width) continue; 
         for(y=0;y < overlay->height;y++) 
         { 
          if(y+location.y>=src->height) continue; 
          CvScalar source = cvGet2D(src, y+location.y, x+location.x); 
          CvScalar over = cvGet2D(overlay, y, x); 
          CvScalar merged; 
          if(over.val[0] == 255 && over.val[1] == 255 && over.val[2] == 255 && over.val[3] == 255) 
          { 
           // White pixel so don't overlay 
           for(i=0;i<4;i++) 
            merged.val[i] = (source.val[i]); 
          } 
          else 
          { 
           for(i=0;i<4;i++) 
            merged.val[i] = (over.val[i]); 
    
          } 
    
          cvSet2D(src, y+location.y, x+location.x, merged); 
         } 
        } 
    } 
    
    +0

    +1 ...好想法......但如果我有一些代码可以做到这一点,它会更酷...... – Wazzzy

    0

    我想你想达到什么是不是加法而是乘法:

    int multiplicator = over.val[i]/255 // 0 for black, 1 for white 
    merged.val[i] = source.val[i] * multiplicator; 
    

    这样的像素值将是一个白色的覆盖像素和黑色的黑色覆盖像素的原始值。