OpenCV 复制图像的一部分
OpenCV copying subsection of an image
我想做什么
我正在尝试将一张图片的 小节 粘贴到另一张图片 上,作为我正在处理的项目的一部分。当我试图查看到目前为止的内容时,我发现调用 imshow()
来检查两个图像实际上并没有显示它们在它们应该的点上具有相同的 BRG 值。
怎么了
这些值几乎总是错误的,而且通常一半的屏幕会显示为黑色。
IE:firstIMG
的像素 [0,1] 将具有 [91,21,30] 而 secondIMG
将鼠标悬停在 [=12= 中的像素上时将具有其他一些值] 屏幕
代码
// 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 值,[例如 post][1]。这仍然会导致在它们共享的点上具有完全不同的值的相同结果。
最后,我还尝试直接 clone()
firstIMG
具有相同的大小和所有内容,也导致与上述相同的错误。
[1]:
彩色图片应该是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();
我想做什么
我正在尝试将一张图片的 小节 粘贴到另一张图片 上,作为我正在处理的项目的一部分。当我试图查看到目前为止的内容时,我发现调用 imshow()
来检查两个图像实际上并没有显示它们在它们应该的点上具有相同的 BRG 值。
怎么了
这些值几乎总是错误的,而且通常一半的屏幕会显示为黑色。
IE:firstIMG
的像素 [0,1] 将具有 [91,21,30] 而 secondIMG
将鼠标悬停在 [=12= 中的像素上时将具有其他一些值] 屏幕
代码
// 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 值,[例如 post][1]。这仍然会导致在它们共享的点上具有完全不同的值的相同结果。
最后,我还尝试直接 clone()
firstIMG
具有相同的大小和所有内容,也导致与上述相同的错误。
[1]:
彩色图片应该是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();