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);
  • 效果图
    opencv copyTo将图像上特定区域图像复制到原图对应位置的新图像上_第1张图片

  • 然而新的问题又出现了,由于直接将区域复制到新图像上导致提取轮廓时,将区域图像外边框也进行了提取而这个边框是不需要的,想想看怎么把它处理掉。
    opencv copyTo将图像上特定区域图像复制到原图对应位置的新图像上_第2张图片

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

你可能感兴趣的:(笔记,opencv,计算机视觉,图像处理)