复制非矩形roi opencv

MMH*_*MMH 11 c c++ opencv roi

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

源图像和目标图像具有相同的大小.

这是一个源图像的例子,我知道p1,p2,p3,p4,我想将该部分复制到一个新图像.在此输入图像描述

我已经有了目的地形象.例如,下面的图像是目标图像,我想只将源图像的标记部分粘贴到目标图像.我该怎么做?在此输入图像描述

最终输出看起来应该是这样的.在此输入图像描述

谢谢,

Har*_*ris 20

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

  2. 现在使用Mat :: copyTo()将你的黑色图像复制到这里,你可以使用上面的面具.

将黑色图像和蒙版分配为源大小

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));
Run Code Online (Sandbox Code Playgroud)

现在使用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 );
Run Code Online (Sandbox Code Playgroud)

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

black.copyTo(src,mask);  
Run Code Online (Sandbox Code Playgroud)

见下面的结果,

在此输入图像描述

编辑:

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

  1. 首先如上所述创建Mask图像

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

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

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

    假设您已经创建了如上所述的掩码

    将源复制到新Mat

    Mat dst1;
    src.copyTo(dst1,mask);
    
    Run Code Online (Sandbox Code Playgroud)

现在反转Mask并将目标图像复制到新Mat

Mat dst2;
bitwise_not(mask,mask);
dst.copyTo(dst2,mask);
Run Code Online (Sandbox Code Playgroud)

通过添加两者来获得最终结果

Mat result=dest1+dest2;
Run Code Online (Sandbox Code Playgroud)

如果您的两个图像大小不同,那么您可以使用以下代码

在这里你应该使用图像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]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述