复制非矩形roi opencv

时间:2014-02-28 10:56:42

标签: c++ c opencv roi

我想用C ++ opencv复制非矩形图像的一部分。零件的角点在图像中是已知的。我想将它粘贴在精确位置的另一张图像中。有人可以帮帮我吗?

源图像和目标图像大小相同。

这是源图像的示例,我知道p1,p2,p3,p4,我想将该部分复制到新图像。enter image description here

我已经有了目标图片。例如,下面的图像是目标图像,我想只将源图像的标记部分粘贴到目标图像。我该怎么办?enter image description here

最终输出应该与此类似。enter image description here

谢谢,

1 个答案:

答案 0 :(得分:20)

  1. 首先使用您的四个坐标创建一个蒙版图像。

  2. 现在使用Mat::copyTo()复制你的黑白图像来源,你可以使用上面的面具。

  3. 将黑色图像和遮罩分配为源尺寸

    Mat src=imread("img.png",1);
    Mat black(src.rows, src.cols, src.type(), cv::Scalar::all(0));
    Mat mask(src.rows, src.cols, CV_8UC1, cv::Scalar(0));
    

    现在使用drawContours创建蒙版图像,此处应使用CV_FILLED作为轮廓粗细。

       vector< vector<Point> >  co_ordinates;
       co_ordinates.push_back(vector<Point>());
       co_ordinates[0].push_back(P1);
       co_ordinates[0].push_back(P2);
       co_ordinates[0].push_back(P3);
       co_ordinates[0].push_back(P4);
       drawContours( mask,co_ordinates,0, Scalar(255),CV_FILLED, 8 );
    

    最后使用上面的掩码将黑色图像复制到源

    black.copyTo(src,mask);  
    
      

    见下面的结果,

    enter image description here

    修改:

    根据您在下面的评论,您需要遵循以下步骤

    1. 首先创建如上所述的蒙版图像

    2. 使用蒙版将源图像复制到新的Mat dst1。

    3. 反转蒙版并将目标图像复制到新的Mat dst2

    4. 对于最终结果,只需将dest1和dest2加到新Mat。

      假设您已经创建了上面的掩码

      将源复制到新Mat

      Mat dst1;
      src.copyTo(dst1,mask);
      
    5. 现在反转Mask并将目标图像复制到新Mat

      Mat dst2;
      bitwise_not(mask,mask);
      dst.copyTo(dst2,mask);
      

      通过添加

      获得最终结果
      Mat result=dest1+dest2;
      

      如果您的两张图片大小不同,则可以使用以下代码

      在这里你应该使用图像ROI进行复制,创建掩码等。

      ![Mat src=imread("src.png",1);
      Mat dst=imread("dest.jpg",1);
      int new_w=0;
      int new_h=0;
      if(src.cols>dst.cols)
       new_w=dst.cols;
      else
       new_w=src.cols;
      
      if(src.rows>dst.rows)
       new_h=dst.rows;
      else
       new_h=src.rows;
      
      Rect rectROI(0,0,new_w,new_h);
      Mat mask(new_h, new_w, CV_8UC1, cv::Scalar(0));
      
      Point P1(107,41);
      Point P2(507,61);
      Point P3(495,280);
      Point P4(110,253);
      vector< vector<Point> >  co_ordinates;
      co_ordinates.push_back(vector<Point>());
      
      co_ordinates\[0\].push_back(P1);
      co_ordinates\[0\].push_back(P2);
      co_ordinates\[0\].push_back(P3);
      co_ordinates\[0\].push_back(P4);
      drawContours( mask,co_ordinates,0, Scalar(255),CV_FILLED, 8 );
      
      Mat srcROI=src(rectROI);
      Mat dstROI=dst(rectROI);
      Mat dst1;
      Mat dst2;
      
      srcROI.copyTo(dst1,mask);
      imwrite("dst1.jpg",dst1);
      
      bitwise_not(mask,mask);
      dstROI.copyTo(dst2,mask);
      
      dstROI.setTo(0);
      dstROI=dst1+dst2;
      imshow("final result",dst);][4]
      

      enter image description here