1.point
Point pt;//点的表示
pt.x = 10;
pt.y = 20;
2.Rect
矩阵的表示
Rect rect(10, 20, 10, 10);//(10,20)是坐标,10*10是大小
3.Mat
Mat img; //无初始化赋值
Mat img1(100, 200, CV_8UC1);//创建100行200列类型为8位的单通道矩阵
Mat img2(Size(200, 100), CV_8UC1);//创建200*100类型为8位的单通道矩阵
Mat img3(Size(200, 100), CV_8UC3, Scalar(0, 255, 0));//创建200*100类型为8位的三通道矩阵
Mat img4(Size(200, 100), CV_8UC1, Scalar(0, 255, 0));//创建200*100类型为8位的单通道矩阵
4.图像的复制
cv::Mat a;
cv::Mat b = a; // 浅拷贝, 只拷贝矩阵头, 数据并没有复制
cv::Mat c(a); // 浅拷贝, 只拷贝矩阵头, 数据并没有复制
cv::Mat d = a.clone(); // 深拷贝, 矩阵头和数据都拷贝了
cv::Mat e;
a.copyTo(e); // 深拷贝, 矩阵头和数据都拷贝了
5.颜色空间
1.BGR
2.HSV
H表示色调[0-360]
S表示饱和度[0-1]
V表示亮度[0-1]
3.LAB
L亮度[0-100]
a 和b是两个颜色通道[-127,128]
a包括的颜色是从深绿色(低亮度值)到灰色(中亮度值)再到亮粉红色(高亮度值);b是从亮蓝色(低亮度值)到灰色(中亮度值)再到黄色(高亮度值)。
6.图形绘制
Mat img(300, 300, CV_8UC3, Scalar(0, 0, 0));
line(img, Point(10, 10), Point(200, 200), Scalar(0, 255, 255), 10, 8);
//画线,两点确定一条直线
circle(img, Point(150, 150), 100, Scalar(255, 255, 0), -1, 8);
//画圆,中心点+半径,倒数第二个参数正数为线宽,负数会填充图形
rectangle(img, Point(10, 10), Point(240, 200), Scalar(0, 0, 255), 2, 8);
//画矩形,通过左上角和右下角两点确定矩形
rectangle(img, Rect(10, 10, 230, 190), Scalar(0, 0, 255), -1, 8);
//画矩形,(10,10)是左上角左边,230和190是长和宽
ellipse(img, Point(150, 150), Size(100, 50), 45, 0, 360, Scalar(0, 255, 255), 2, 8);
//画椭圆,Point是中心点,Size是长轴和短轴,45是旋转角度,0和360是范围
ellipse(img, RotatedRect(Point(150, 150), Size(100, 50), 0), Scalar(0,255,255), 2, 8);
//这里的椭圆是按照RotatedRect(Point来画的,就是用一个矩形把椭圆给框柱
Point ppt[] = {Point(120, 50), Point(180, 50), Point(210, 100), Point(180, 150), Point(120, 150), Point(90, 100)};//点集
const Point* pts[] = {ppt};//因为fillPoly和polylines第二个和第三参数必须是指针,所以这里定义
int npt[] ={6};//因为fillPoly和polylines第二个和第三参数必须是指针,所以这里定义,表示点的个数
fillPoly(img, pts, npt, 1, Scalar(0, 255, 255), 8); //画填充多边形,1为要绘制的多边形数量为1
polylines(img, pts, npt, 1, true, Scalar(0, 154, 209), 2, 8); //画非填充多边形,1为要绘制的多边形数量为1
putText(img, "China", Point(100, 100), FONT_HERSHEY_COMPLEX, 2, Scalar(0, 255, 255), 2, 8);//第一个二为字体大小
waitKey(0);
7.基本图像运算
7.1加法
7.1.1api
//直接做简单像素的加法
+号,add(img1, img2, dst);
//占有一定权重的加法
void cvAddWeighted( const CvArr* src1, double alpha,const CvArr* src2, double beta,double gamma, CvArr* dst );
参数1:src1,第一个原数组.
参数2:alpha,第一个数组元素权重
参数3:src2,第二个原数组
参数4:beta,第二个数组元素权重
参数5:gamma,图1与图2作和后添加的数值。不要太大,不然图片一片白。总和等于255以上就是纯白色了。
参数6:dst,输出图片
7.1.2代码示例
void main()
{
Mat car, rabbit;
Mat des;
car = imread("E:\\OpenCV\\images\\car.jpg");
rabbit= imread("E:\\OpenCV\\images\\rabbit.jpg");
addWeighted(car, 0.5, rabbit, 0.5, 0, des);//1/2car的像素加1/2rabbit的像素
imshow("img", des);
waitKey();
}
7.2减法
7.2.1api
//直接做简单像素的减法
-号,subtract(img1, img2, dst);
//将两张图片相减之后的值,如果这个值为负,则取他的绝对值
void cvAbsDiff( const CvArr* src1, const CvArr* src2, CvArr* dst );
src1第一个原数组
src2第二个原数组
dst输出数组
函数 cvAbsDiff 计算两个数组差的绝对值
dst(I)c = abs(src1(I)c - src2(I)c).
7.3其他
bitwise_and(img1, img2, dst);//与
bitwise_or(img1, img2, dst);//或
bitwise_not(img1, dst);//非
bitwise_xor(img1, img2, dst);//异或
8.对比度,亮度调整与通道分离
比较简单不做赘述
#include "opencv2/opencv.hpp"
using namespace cv;
//#define WIN_NAME "输出图像"
//Mat srcImg;
//Mat dstImg;
//int Contrase_Value = 20;
//int Bright_Value = 20;
//
//void OnChange(int, void*)//用来演示对比度和亮度效果
//{
// for(int i = 0; i<srcImg.rows; i++)
// {
// for(int j = 0; j<srcImg.cols; j++)
// {
// dstImg.at<Vec3b>(i, j)[0] = saturate_cast<uchar>(Contrase_Value * 0.01 * srcImg.at<Vec3b>(i, j)[0] + Bright_Value);
// dstImg.at<Vec3b>(i, j)[1] = saturate_cast<uchar>(Contrase_Value * 0.01 * srcImg.at<Vec3b>(i, j)[1] + Bright_Value);
// dstImg.at<Vec3b>(i, j)[2] = saturate_cast<uchar>(Contrase_Value * 0.01 * srcImg.at<Vec3b>(i, j)[2] + Bright_Value);
// }
// }
// imshow("原图", srcImg);
// imshow(WIN_NAME, dstImg);
//}
void main()
{
//对比度和亮度效果演示
//srcImg = imread("1.jpg");
//dstImg = Mat::zeros(srcImg.size(), srcImg.type());
Mat::zeros(); //将矩阵元素都置为0
Mat::ones(); //将矩阵元素都置为1
//namedWindow(WIN_NAME, CV_WINDOW_AUTOSIZE);
//createTrackbar("对比度", WIN_NAME, &Contrase_Value, 300, OnChange, 0);
//createTrackbar("亮 度", WIN_NAME, &Bright_Value, 200, OnChange, 0);
//OnChange(Contrase_Value, 0); //回调函数初始化
//OnChange(Bright_Value, 0);
//waitKey(0);
Mat img = imread("2.jpg");
Mat dst;
vector<Mat> channels;
split(img, channels);//分离像素通道
Mat blueChannel = channels.at(0);
Mat greenChannel = channels.at(1);
Mat redChannel = channels.at(2);
merge(channels, dst);//合并像素通道
/*imshow("Blue", blueChannel);
imshow("green", greenChannel);
imshow("red", redChannel);*/
imshow("dst", dst);
waitKey(0);
}