在访问图像像素opencv提供了基本的三种方式:
一、指针
二、迭代
三、at()函数
下面就使用at()函数遇到的问题说一说,希望能帮到人,同时也希望有大神给透彻分析一下。
成功例子:
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
//Mat img = imread("Lena.jpg");直接采用imread()函数就会报内存读取错误,没找出来原因。
IplImage *image = cvLoadImage("E:\\···Lena.jpg");
Mat img(image,true); //转换成Mat类型
if (!img.data)
{
cout<<"Error";
}
for (int i=0;i<img.rows;i++)
{
for (int j=0;j<img.cols;j++)
{//彩色图像分为三个通道,每个像素值由三个分量组成
Vec3b pixe;
pixe[0] = i%255;
pixe[1] = j%55;
pixe[2] = 200;//分别设置三个分量的值,并把值存到容器中
img.at<Vec3b>(i,j) = pixe;//此处对每个像素赋值
}
}
imshow("img",img);
waitKey(0);
return 0;
}
具体的针对单个像素的操作:
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
const int num = 300;
void salt_pepper(Mat &img)
{
for (int i=0;i<num;i++)
{
int x = rand() % 255;
int y = rand() % 255;
if (img.channels() == 3)
{
img.at<Vec3b>(x,y)[0] = 255;
img.at<Vec3b>(x,y)[1] = 255;
img.at<Vec3b>(x,y)[2] = 255;
}
}
}
int main()
{
Mat img = imread("Lena.jpg");
if (!img.data)
{
cout<<"error";
}
salt_pepper(img);
imshow("salt_pepper",img);
waitKey(0);
return 0;
}