图像的 OpenCV 复制子部分
OpenCV copying subsection of an image
我想做什么
我正在尝试将一个图像的子部分粘贴到另一个图像上,用于我正在处理的项目的一部分。当我尝试查看到目前为止的内容时,我发现调用两个图像上的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
。
您可以使用优化的内置函数,而不是遍历像素。
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();
相关文章:
- 图像的 OpenCV 复制子部分
- 如何将 cv::Mat & Img 复制到未签名的 char* img?opencv
- 将元素从opencv矩阵复制到特征矩阵
- 将一个 OpenCV OutputArrayOfArrays 对象复制到另一个对象
- OpenCV Mat对象复制速度更快
- 在不复制数据的情况下更改 opencv mat 中的列顺序
- 将一个通道数据复制到OpenCV中的另一个通道
- 在 OpenCV 中显式复制像素值时出现空白帧
- 从矩阵复制列向量到OpenCV中另一个矩阵的每个col
- 如何使用OpenCV将向量向量的结构复制到另一个向量C++
- 一个矩阵中的数据在 C++ 中自动复制到 OpenCV 中的另一个矩阵
- OpenCV 提取的描述符会导致 valgrind 在被复制时报告无效读取
- 在不复制数据的情况下将OpenCV Mat发送到MATLAB工作区的方法
- OpenCV 将一个矩阵复制到另一个矩阵的第一列中
- 不必在OpenCV中复制垫子的最佳方法
- 在矢量到矢量中复制数据<float> <Mat> (Opencv/C++)
- 尝试复制部分 OpenCV 矩阵时断言失败
- 使用opencv复制/混合不同大小的图像
- 选择一个垫子的子集并复制它们以在C++/Opencv中创建一个新垫子
- 拆分OpenCV Mat而不复制数据