如何在openCV中修改cv::Mat的像素数据?
Posted
技术标签:
【中文标题】如何在openCV中修改cv::Mat的像素数据?【英文标题】:How to modify pixel data of cv::Mat in openCV? 【发布时间】:2013-12-23 11:34:12 【问题描述】:我基本上尝试了一些方法来修改这里已经存在的问题的像素数据。但是,没有什么能正常工作。
我正在开发 ios OpenCV2.framework。
我已经实现了以下方法,但它没有修改 outputImage。
UIImage *inputUIImage = [UIImage imageName:@"someImage.png"];
UIImage *outputUIImage = nil;
cv::Mat inputImage = <Getting this from a method that converts UIImage to cv::Mat: Working properly>
cv::Mat outputImage;
inputImage.copyTo(outputImage);
//processing...
for(int i=0; i < outputImage.rows; i++)
for (int j=0; j<outputImage.cols; j++)
Vec4b bgrColor = outputImage.at<Vec4b>(i,j);
//converting the 1st channel <assuming the sequence to be BGRA>
// to a very small value of blue i.e. 1 (out of 255)
bgrColor.val[0] = (uchar)1.0f;
outputUIImage = <Converting cv::Mat to UIImage via a local method : Working properly>
self.imageView1.image = inputUIImage;
self.imageView2.image = outputUIImage;
//here both images are same in colour. no changes.
谁能告诉我我错过了什么?
【问题讨论】:
【参考方案1】:问题是您正在将outputImage.at<Vec4b>(i,j)
返回的引用复制到局部变量 bgrColor 并修改该变量。所以 outputImage 中的任何内容实际上都没有被修改。你要做的是直接修改Mat::at
返回的引用。
解决方案:
Vec4b& bgrColor = outputImage.at<Vec4b>(i,j);
bgrColor.val[0] = (uchar)1.0f;
或
outputImage.at<Vec4b>(i,j)[0] = (uchar)1.0f;
【讨论】:
但是在您的解决方案中,即使您编写的代码与我为第一个所做的相同.. 并且它不起作用.. 但是,我会尝试第二个。 对不起。错字。现已修复 嗯,我明白了.. 现在它是一个参考。 完成!两种方式现在都有效..我以前认为返回的 Vec4b 应该已经是一个指针,因为在代码中没有明显的复制操作..但是该死!数据类型后面没有“&”会导致复制操作。 8o以上是关于如何在openCV中修改cv::Mat的像素数据?的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV 使用 stride 从数组生成 cv::Mat
如何在不同线程的 C++/CLI 中将图像数据从 BitmapSource (WPF) 复制到 cv::Mat (OpenCV)?