opencv copyTo将图像上特定区域图像复制到原图对应位置的新图像上

  • 因为想对图像某些部分进行二次处理,然而直接切割出来的话不好再映射到原图,于是想着将需处理的部分复制到一张和原图一样的大小的纯黑图片上并且不改变它在原图的位置,这样对它进行处理后得到的轮廓坐标等信息可以直接处理回原图上。
  • 考虑了opencv中的copyTo算子,然而可能由于操作失误直接使用image1.copyTo(image2)后得到的仅仅只是image1,而不能得到将image1复制粘贴到image2图像上的效果,这是当时的代码:
//创建一张和原图image相同大小的纯黑图像image2
cv::Mat image2 = cv::Mat::zeros(image.rows,image.cols,CV_8UC3);
//设置图像image2的颜色(不设置也行上面那行代码直接就是生成纯黑的图像,也可以设置成其他颜色)
image2.setTo(cv::Scalar(0, 0, 0));
//image1是从原图image上切割出的ROI区域
Mat image1 = image(Rect(boundRect[i].x, boundRect[i].y,boundRect[i].width, boundRect[i].height));
//或者也可以使用copyTo从原图image中切割出ROI区域到image1图像
//image(Rect(boundRect[i].x, boundRect[i].y,boundRect[i].width, boundRect[i].height)).copyTo(image1);
//尝试使用copyTo复制后进行保存图片大小明显和原图不一样
image1.copyTo(image2);
imwrite("good.jpg",image2);
  • 效果图
    在这里插入图片描述

  • 后来baidu发现可能是由于没有设置绘制区域,设置后就可以达到想要的效果,将ROI区域复制到与原图相同大小的纯黑图图像上,并且位置和之前在原图上的一样
  • 关键代码cv::Rect roi_rect = cv::Rect(Rect(boundRect[i].x, boundRect[i].y,boundRect[i].width, boundRect[i].height));
//创建一张和原图image相同大小的纯黑图像image2
cv::Mat image2 = cv::Mat::zeros(image.rows,image.cols,CV_8UC3);
//设置图像image2的颜色(不设置也行上面那行代码直接就是生成纯黑的图像,也可以设置成其他颜色)
image2.setTo(cv::Scalar(0, 0, 0));
//image1是从原图image上切割出的ROI区域图像
Mat image1 = image(Rect(boundRect[i].x, boundRect[i].y,boundRect[i].width, boundRect[i].height));
//或者也可以使用copyTo从原图image中切割出ROI区域到image1图像
//image(Rect(boundRect[i].x, boundRect[i].y,boundRect[i].width, boundRect[i].height)).copyTo(image1);
//这是ROI区域图像对应的区域位置
cv::Rect roi_rect = cv::Rect(Rect(boundRect[i].x, boundRect[i].y,boundRect[i].width, boundRect[i].height));
image1.copyTo(image2(roi_rect));
imwrite("good.jpg",image2);
  • 效果图
    在这里插入图片描述

  • 然而新的问题又出现了,由于直接将区域复制到新图像上导致提取轮廓时,将区域图像外边框也进行了提取而这个边框是不需要的,想想看怎么把它处理掉。
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/476f98f4e3b54c9d8c7bcc0a7b014837.jpeg#

(o-ωq)).oO
在这里插入图片描述

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您好!要将一个图像中的多边形复制到另一个图像,可以使用以下步骤: 1. 使用 OpenCV 读取源图像和目标图像。 ```python import cv2 src_img = cv2.imread('source_image.jpg') dst_img = cv2.imread('destination_image.jpg') ``` 2. 使用 OpenCV 的 `cv2.fillPoly()` 函数在源图像中绘制多边形。 ```python import numpy as np # 定义多边形顶点坐标 pts = np.array([[100, 100], [200, 50], [300, 150], [200, 200]], np.int32) # 在源图像中绘制多边形 cv2.fillPoly(src_img, [pts], (255, 255, 255)) ``` 3. 使用 OpenCV 的 `cv2.bitwise_and()` 函数将源图像中的多边形与目标图像进行逐像素的“与”操作,得到重叠区域。 ```python # 将源图像中的多边形与目标图像进行“与”操作 mask = cv2.bitwise_and(src_img, dst_img) ``` 4. 使用 OpenCV 的 `cv2.addWeighted()` 函数将重叠区域叠加到目标图像上。 ```python # 将重叠区域叠加到目标图像上 result = cv2.addWeighted(mask, 1, dst_img, 1, 0) ``` 完整代码如下: ```python import cv2 import numpy as np # 读取源图像和目标图像 src_img = cv2.imread('source_image.jpg') dst_img = cv2.imread('destination_image.jpg') # 定义多边形顶点坐标 pts = np.array([[100, 100], [200, 50], [300, 150], [200, 200]], np.int32) # 在源图像中绘制多边形 cv2.fillPoly(src_img, [pts], (255, 255, 255)) # 将源图像中的多边形与目标图像进行“与”操作 mask = cv2.bitwise_and(src_img, dst_img) # 将重叠区域叠加到目标图像上 result = cv2.addWeighted(mask, 1, dst_img, 1, 0) # 显示结果 cv2.imshow('Result', result) cv2.waitKey(0) cv2.destroyAllWindows() ``` 注意:在使用 `cv2.fillPoly()` 函数绘制多边形时,需要确保多边形的顶点坐标顺序是按照顺时针或逆时针排列的,否则可能会出现意想不到的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值