【发布时间】:2020-05-29 19:57:48
【问题描述】:
我想要做什么
我正在尝试将一个图像的子部分粘贴到另一个图像上,以作为我正在进行的项目的一部分。当我尝试查看到目前为止的内容时,我发现在两个图像上调用 imshow() 进行检查实际上并不能表明它们在它们应该具有相同的 BRG 值。
怎么了
这些值几乎总是错误的,通常一半的屏幕会显示为黑色。
IE:firstIMG 的像素 [0,1] 将具有 [91,21,30] 而secondIMG 将鼠标悬停在imshow() 屏幕中的像素上时将具有一些其他值
代码
// Randomly create an image of 10x10 pixels
Mat firstIMG = Mat(10, 10, CV_8UC3);
randu(firstIMG, Scalar::all(0), Scalar::all(255));
imshow("First", firstIMG);
waitKey();
// Create a second image of same type as the first
Mat secondIMG = Mat::zeros(firstIMG.rows-5, firstIMG.cols-5, firstIMG.type());
// Iterate through all rows of secondIMG
for(int i = 0; i < secondIMG.rows; i++) {
// Iterate through all columns of secondIMG
for(int j = 0; j < secondIMG.cols; j++) {
secondIMG.at<unsigned char>(i, j) = firstIMG.at<unsigned char>(i, j);
}
}
imshow("Second", secondIMG);
waitKey();
到目前为止我已经尝试过什么
如果我遍历每个图像的每个像素,它将为两个图像打印出完全相同的数据,但是当我在secondIMG 上使用imshow() 时,即使不是所有像素,也有很多是不正确的。
尽管如此,我还尝试以不同的方式访问和更改 secondIMG 的 BRG 值,[就像在这篇文章中一样][1]。这仍然会导致在它们共享的点上完全不同的值产生相同的结果。
最后,我还直接尝试了 clone() 和 firstIMG,大小和所有内容都相同,也导致与上述相同的错误。
[1]: https://stackoverflow.com/questions/7899108/opencv-get-pixel-channel-value-from-mat-image
【问题讨论】:
-
应该是
cv::Vec3b,而不是uchar。您正在使用 3 通道图像。 -
你是 100% 正确的,谢谢!
-
也许你应该在回答部分回答问题。这样人们就更容易找到正确的答案。
-
您的答案不应该在问题上,请在下面的部分中回答。
-
正确的解决方案是使用
operator()获取投资回报率,然后使用clone(),或使用copyTo()。在使用 OpenCV 的绝大多数情况下,不需要显式迭代单个像素……尤其是当它是微不足道的时候。