Mat = image;
//单通道元素级别访问:
image.at<uchar>(j, i) = 255;
//多通道元素
image.at<cv::Vec3b>(i, j)[0] = 255
注意Vec3b不是Vec3d,不然会中断程序运行
区别在于:
typedef Vec<uchar, 3> Vec3b;
typedef Vec<double, 3> Vec3d;
代码
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
#include<windows.h>
using namespace std;
using namespace cv;
int main( int argc, char ** argv )
{
argv[1] = "C:\\Users\\Forrest\\Pictures\\cute.jpg";
Mat image;
image = imread(argv[1], CV_LOAD_IMAGE_COLOR);
if (!image.data)
{
cout << "无法打开或找不到图文件" << endl;
return -1;
}
namedWindow("原图", CV_WINDOW_NORMAL);
namedWindow("下雪图", CV_WINDOW_NORMAL);
imshow("原图", image);
int i = 600;//雪点数;
for (int k = 0; k < i; k++)
{
//rand() is MFC random number generator
// tyr qrand() with Qt
int i = rand() % image.cols;
int j = rand() % image.rows;
if (image.channels() == 1)
{
image.at<uchar>(j, i) = 255;
if (i < image.cols)
image.at<uchar>(j+1,i) = 255;
if (j < image.rows)
image.at<uchar>(j, i + 1) = 255;
if (i < image.cols && j < image.rows)
image.at<uchar>(j + 1, i + 1) = 255;
}
else if (image.channels() == 3)
{
image.at<cv::Vec3b>(j, i)[0] = 255;
image.at<cv::Vec3b>(j, i)[1] = 255;
image.at<cv::Vec3b>(j, i)[2] = 255;
if (i < image.cols - 1)
{
image.at<cv::Vec3b>(j, i + 1)[0] = 255;
image.at<cv::Vec3b>(j, i + 1)[1] = 255;
image.at<cv::Vec3b>(j, i + 1)[2] = 255;
}
if (j < image.rows - 1)
{
image.at<cv::Vec3b>(j+1, i)[0] = 255;
image.at<cv::Vec3b>(j+1, i)[1] = 255;
image.at<cv::Vec3b>(j+1, i)[2] = 255;
}
if (i < image.cols - 1 && j < image.rows - 1)
{
image.at<cv::Vec3b>(j + 1, i + 1)[0] = 255;
image.at<cv::Vec3b>(j + 1, i + 1)[1] = 255;
image.at<cv::Vec3b>(j + 1, i + 1)[2] = 255;
}
}
}
imshow("下雪图", image);
waitKey(0);
}