如何在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&lt;Vec4b&gt;(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】cv::Mat像素遍历方法比较

打印 cv::Mat opencv

OpenCV 使用 stride 从数组生成 cv::Mat

如何在不同线程的 C++/CLI 中将图像数据从 BitmapSource (WPF) 复制到 cv::Mat (OpenCV)?

如何在 OpenCV 中计算 Mat 的最大像素值 [重复]

opencv::Mat,从原始数据中获取像素值?