C++ OpenCV复制图像的一部分 我想做什么

C++ OpenCV复制图像的一部分 我想做什么,c++,opencv,pixel,mat,C++,Opencv,Pixel,Mat,我正在尝试将一个图像的一部分粘贴到另一个图像上,这是我正在进行的项目的一部分。当我尝试查看到目前为止的内容时,我发现在两个图像上调用imshow()进行检查实际上并没有显示它们在应该检查的点上具有相同的BRG值。 怎么了 这些值几乎总是错误的,并且通常屏幕的一半显示为黑色 IE:firstIMG的像素[0,1]将具有[91,21,30],而当在imshow()屏幕中将鼠标悬停在像素上方时,secondIMG将具有一些其他值 代码 //随机创建一个10x10像素的图像 Mat firstIMG=M

我正在尝试将一个图像的一部分粘贴到另一个图像上,这是我正在进行的项目的一部分。当我尝试查看到目前为止的内容时,我发现在两个图像上调用
imshow()
进行检查实际上并没有显示它们在应该检查的点上具有相同的BRG值。

怎么了 这些值几乎总是错误的,并且通常屏幕的一半显示为黑色

IE:firstIMG的像素[0,1]将具有[91,21,30],而当在
imshow()屏幕中将鼠标悬停在像素上方时,
secondIMG
将具有一些其他值

代码
//随机创建一个10x10像素的图像
Mat firstIMG=Mat(10,10,CV_8UC3);
randu(firstIMG,Scalar::all(0),Scalar::all(255));
imshow(“第一”,firstIMG);
waitKey();
//创建与第一个相同类型的第二个图像
Mat secondIMG=Mat::zeros(firstIMG.rows-5,firstIMG.cols-5,firstIMG.type());
//遍历secondIMG的所有行
对于(int i=0;i

到目前为止我都试过了 如果我迭代每个图像的每个像素,它将为两个图像打印出相同的精确数据,但是当我在
secondIMG
上使用
imshow()
时,如果不是所有像素都不正确,则会打印出很多。

尽管如此,我也尝试过以不同的方式访问和更改
secondIMG
的BRG值,[就像在这篇文章中][1]。这仍然会导致相同的结果,即在它们共享的点上产生完全不同的值。

最后,我还直接尝试了
clone()
这个
firstIMG
的大小和所有内容,也导致了与上面相同的错误

  [1]: https://stackoverflow.com/questions/7899108/opencv-get-pixel-channel-value-from-mat-image

对于彩色图像,它应该是
cv::Vec3b
而不是
uchar

您可以使用优化的内置函数,而不是在像素上循环

cv::Mat secondIMG(firstIMG.rows, firstIMG.cols, firstIMG.type());
cv::Rect rect(0, 0, secondIMG.cols, secondIMG.rows);  // x, y, width, height

firstIMG(rect).copyTo(secondIMG);
// or
cv::Mat thirdIMG = firstIMG(rect).clone();

它应该是
cv::Vec3b
,而不是
uchar
。您使用的是3通道图像。您100%正确,谢谢!也许你应该回答答案部分的问题。通过这种方式,人们可以更容易地搜索正确答案。您的答案不应该在问题上,请在下面的部分中回答。正确的解决方案是使用
操作符()
获取ROI,然后使用
克隆()
,或者使用
复制()
。在绝大多数使用OpenCV的情况下,显式迭代单个像素是不必要的。。。尤其是当事情如此琐碎的时候。