我正在玩opencv 3.2(这个库的新手),并注意到cv::Mat::at
方法的一些奇怪的行为。
第一次输入myMat.at
有关方法签名的帮助说明没有显示在QTcreator中,但显示其他方法
第二次迭代图像的像素时,它仅修改图像的某些部分(我最好显示截图和代码)
代码
#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();
}
如您所见,右侧的图像未完全处理,只是其中的一部分。
为什么会这样? 根据代码,它应该处理整个图像。
我在那里错过了什么?
答案 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个频道的图片。