opencv杂七杂八

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);

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值