c++ - OpenCV 复制图像的子部分
问题描述
我正在尝试做的事情
我正在尝试将一个图像的一小部分粘贴到另一个我正在处理的项目中。当我试图查看到目前为止的内容时,我发现调用imshow()
这两个图像进行检查实际上并不能表明它们在应有的点处具有相同的 BRG 值。
怎么了
这些值几乎总是错误的,通常一半的屏幕会显示为黑色。
IE:像素 [0,1]firstIMG
将具有 [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();
到目前为止我尝试过的
如果我遍历每个图像的每个像素,它将为两个图像打印出相同的确切数据,但是当我imshow()
在secondIMG
许多像素上使用时,如果不是所有像素都不正确。
尽管如此,我也尝试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();
推荐阅读
- reactjs - 单击 react-bootstrap-table 2 中的单元格时显示 react Bootstrap Popover
- dji-sdk - DJI SDK Android - 时间线任务中 GoToAction 上不需要的偏航运动
- javascript - 如何修复 JavaScript 中的“未终止的正则表达式文字”错误?
- prolog - 从矩阵打印列表
- csv - 将 REAL 数组写入 CSV 字符串,但在假定大小的数组上编译失败
- javascript - 如果值大于0,如何更改表格数据颜色
- django - 根据发出请求的域过滤查询集
- permissions - 通过 Sublime 在 linux 上编辑 perl 文件需要什么权限
- mysql - MYSQL SELECT CASE 与 SUM 和 MAX
- arrays - 将可能的最小正整数插入唯一整数数组