Opencv cv:Mat :: at允许仅修改部分图像

时间:2017-02-09 17:29:53

标签: c++ opencv

我正在玩opencv 3.2(这个库的新手),并注意到cv::Mat::at方法的一些奇怪的行为。

第一次输入myMat.at有关方法签名的帮助说明没有显示在QTcreator中,但显示其他方法

第二次迭代图像的像素时,它仅修改图像的某些部分(我最好显示截图和代码)

enter image description here

代码

#include <QCoreApplication>
#include <QDebug>

#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgcodecs.hpp>
#include <stdint.h>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    cv::Mat orignalImg = cv::imread("/path/to/image/pic3.jpg", cv::IMREAD_ANYCOLOR);
    cv::Mat modifiedImg = cv::imread("/path/to/image/pic3.jpg", cv::IMREAD_ANYCOLOR);

    for (int r = 0; r < modifiedImg.rows; ++r)
    {
        for (int c = 0; c < modifiedImg.cols; ++c)
        {
            modifiedImg.at<uint8_t>(r, c) = modifiedImg.at<uint8_t>(r, c) * 0.2f;
        }
    }

    cv::imshow("original", orignalImg);
    cv::imshow("modified", modifiedImg);
    cv::waitKey(0);
    return a.exec();
}

如您所见,右侧的图像未完全处理,只是其中的一部分。

为什么会这样? 根据代码,它应该处理整个图像。

我在那里错过了什么?

1 个答案:

答案 0 :(得分:3)

您正在使用context访问Mat(顺便说一句,您应该使用at<uint8_t>代替),这意味着该图片的类型为at<uchar>,即1通道(CV_8UC1)的矩阵,基础类型为8位无符号(C1)。

但是,你是一个彩色图像,这意味着它有3个通道(8U),类型为8位无符号(C3),这意味着8位用于表示每种颜色B, G,R(8U)。这意味着图片的类型为0:255,您应该使用CV_8UC3访问该图片。

所以你的代码变成了:

at<cv::Vec3b>

您还可以避免扫描图像,并直接使用:

 modifiedImg.at<Vec3b>(r, c) = modifiedImg.at<Vec3b>(r, c) * 0.2f; 

您还可以modifiedImg = modifiedImg * 0.2f; 使用imread(默认设置),以确保加载3个频道的图片。