一、
1.图像是由像素组成的,而像素实际上就是带有坐标位置和颜色信息的点。我们把图片想象成由若干行,若干列的点组成的, 现实中有RGB颜色系统,我们可以把图中任意一点(位置在第m行,第n列)的点A表示为A[m,n] = [blue,green,red]
2.图像亮度
blue,green,red分别代表蓝绿红,每个数值代表的原色的亮度大小。
blue,green,red值越大,图像越亮,当[255,255,255]时,图像为纯白色。越小,图像越黑暗,当[0,0,0]时,图像为纯黑。
3.Vec3b
Vec3b可以看作是vector<uchar, 3>。
简单而言就是一个uchar类型的,长度为3的vector向量。
由于在OpenCV中,使用imread读取到的Mat图像数据,都是用uchar类型的数据存储,对于RGB三通道的图像,每个点的数据都是一个Vec3b类型的数据。使用at定位方法如下:
img.at<Vec3b>(row, col)[0] = 255; // 这是指修改B通道数据
img.at<Vec3b>(row, col)[1] = 255; // 这是指修改G通道数据
img.at<Vec3b>(row, col)[2] = 255; // 这是指修改R通道数据
//读取图像的像素值
int b=img.at<Vec3b>(y,x)[0]; // blue
int g=img.at<Vec3b>(y,x)[1]; // green
int r=img.at<Vec3b>(y,x)[2]; // red
4.putText
cv::putText(matTest,"test",cv::Point(30,30),cv::FONT_HERSHEY_SIMPLEX,1,cv::Scalar(255,0,0),2,cv::LINE_AA,false);
CV_EXPORTS_W void putText( InputOutputArray img, const String& text, Point org,
int fontFace, double fontScale, Scalar color,
int thickness = 1, int lineType = LINE_8,
bool bottomLeftOrigin = false );
text:输入的字符串
org:图像中文本字符串的左下角
fontFace:字体类型
fontScale:字体缩放倍数,默认为1,不缩放
bottomLeftOrigin:坐标起点位置,为true时起点在左下角,为false时起点在左上角
二、
#include "opencv2/opencv.hpp" #include <QDebug> int main(int argc, char *argv[]) { cv::Mat matTest(10,20,CV_8UC3); int channels=matTest.channels(); int rows=matTest.rows; int cols=matTest.cols; qDebug()<<"matTest channels:"<<channels; //存取彩色图像的像素 for(int i=0;i<rows;i++) { for(int j=0;j<cols;j++) { matTest.at<cv::Vec3b>(i,j)[0]=0;//b matTest.at<cv::Vec3b>(i,j)[1]=0;//g matTest.at<cv::Vec3b>(i,j)[2]=255;//r } } //cv::imshow("matTest",matTest); cv::Mat matGray; cv::cvtColor(matTest, matGray, CV_BGR2GRAY); int channelsGray=matGray.channels(); qDebug()<<"matGray channels:"<<channelsGray; for(int i=0;i<matGray.rows;i++) { for(int j=0;j<matGray.cols;j++) { matGray.at<uchar>(i,j)=255; } } //cv::imshow("matGray",matGray); matTest.release(); matGray.release(); cv::waitKey(0); return 0; }