复制非矩形roi opencv
我想用C ++ opencv复制一个非矩形图像的一部分。 零件的角点在图像中是已知的。 我想将它粘贴在精确位置的另一张图像中。 有人可以帮帮我吗?
源图像和目标图像具有相同的大小。
这是一个源图像的例子,我知道p1,p2,p3,p4,我想将该部分复制到一个新图像。
我已经有了一个目标图像。 例如,下面的图像是目标图像,我想仅将源图像的标记部分粘贴到目标图像。 我该怎么做?
最终输出看起来应该是这样的。
谢谢,
-
首先使用您的四个坐标创建一个蒙版图像。
-
现在使用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创建蒙版图像,在这里你应该使用CV_FILLED来获得轮廓厚度。
喜欢
vector< vector > co_ordinates; co_ordinates.push_back(vector ()); 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);
见下面的结果,
编辑:
根据您在下面的评论,您需要遵循以下步骤
-
首先创建如上所述的Mask图像
-
使用蒙版将源图像复制到新的Mat dst1。
-
反转蒙版并将目标图像复制到新的Mat dst2
-
对于最终结果,只需将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 > co_ordinates; co_ordinates.push_back(vector ()); 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]