【问题标题】:copying non-rectangular roi opencv复制非矩形 roi opencv
【发布时间】:2023-03-17 12:29:01
【问题描述】:

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

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

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

我已经有一个目标图像。例如下面的图像是目标图像,我只想将源图像的标记部分粘贴到目标图像。怎么办?

最后的输出应该是这个样子。

谢谢,

【问题讨论】:

    标签: c++ c opencv roi


    【解决方案1】:
    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 创建蒙版图像,在这里您应该使用 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);  
    

    查看下面的结果,

    编辑:

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

    1. 首先按照上述方法创建蒙版图片

    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]
    

    【讨论】:

    • 嗨,哈里斯,感谢您的友好回复。但我不想让源图像变黑。我认为我的问题没有得到很好的解释。所以,我再次编辑了这个问题。谢谢
    • 所以你的目标图片大小不一样?
    • 因为它们只是经过编辑的图片。它们不是真正的输出。
    • 嗨,哈里斯,感谢您的更新。我没有得到第三点。你能解释一下吗
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    相关资源
    最近更新 更多