本文共 4353 字,大约阅读时间需要 14 分钟。
Point pt;//点的表示pt.x = 10;pt.y = 20;
矩阵的表示
Rect rect(10, 20, 10, 10);//(10,20)是坐标,10*10是大小
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位的单通道矩阵
cv::Mat a;cv::Mat b = a; // 浅拷贝, 只拷贝矩阵头, 数据并没有复制cv::Mat c(a); // 浅拷贝, 只拷贝矩阵头, 数据并没有复制cv::Mat d = a.clone(); // 深拷贝, 矩阵头和数据都拷贝了cv::Mat e;a.copyTo(e); // 深拷贝, 矩阵头和数据都拷贝了
H表示色调[0-360]
S表示饱和度[0-1] V表示亮度[0-1]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为要绘制的多边形数量为1polylines(img, pts, npt, 1, true, Scalar(0, 154, 209), 2, 8); //画非填充多边形,1为要绘制的多边形数量为1putText(img, "China", Point(100, 100), FONT_HERSHEY_COMPLEX, 2, Scalar(0, 255, 255), 2, 8);//第一个二为字体大小waitKey(0);
//直接做简单像素的加法+号,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,输出图片
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();}
//直接做简单像素的减法-号,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).
bitwise_and(img1, img2, dst);//与bitwise_or(img1, img2, dst);//或bitwise_not(img1, dst);//非bitwise_xor(img1, img2, dst);//异或
比较简单不做赘述
#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(i, j)[0] = saturate_cast (Contrase_Value * 0.01 * srcImg.at (i, j)[0] + Bright_Value);// dstImg.at (i, j)[1] = saturate_cast (Contrase_Value * 0.01 * srcImg.at (i, j)[1] + Bright_Value);// dstImg.at (i, j)[2] = saturate_cast (Contrase_Value * 0.01 * srcImg.at (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 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);}
转载地址:http://lkmzi.baihongyu.com/