c++ - 复制非矩形 roi opencv

标签 c++ c opencv roi

我想用 C++ opencv 复制不是矩形的图像的一部分。零件的角点在图像中是已知的。我想将它粘贴到另一个图像中的确切位置。谁能帮帮我?

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

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

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

最终的输出应该看起来像这样。 enter image description here

谢谢,

最佳答案

  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));

现在使用 drawContours 创建 mask 图像,在这里你应该使用 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 );

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

black.copyTo(src,mask);  

查看下面的结果,

enter image description here

编辑:

根据您在下方的评论,这里是您需要遵循的步骤

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

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

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

  4. 要获得最终结果,只需将 dest1 和 dest2 添加到新的 Mat。

    假设你已经像上面那样创建了面具

    将源代码复制到新的 Mat

    Mat dst1;
    src.copyTo(dst1,mask);
    

现在反转 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

关于c++ - 复制非矩形 roi opencv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22093174/

相关文章:

c++ - 在 OpenCV 中实现复值矩阵方程

android - eclipse上的Android问题的OpenCV 2.4.9

c++ - 使用输出迭代器的通用函数示例不起作用

c++ - 分配给在 C++ 中创建的对象

c++ - BOOST uBLAS 矩阵乘积极慢

c - 我无法从 UART/Nios 读取

c - 如何重置由 pthread_atfork 注册的处理程序

opencv - 在 ConvexHull OpenCV 上填充颜色

c++ - 由于错误代码10093,C++程序无法连接到服务器

c - 什么时候从函数返回值,什么时候使用out参数?