博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
opencv杂七杂八
阅读量:3959 次
发布时间:2019-05-24

本文共 4353 字,大约阅读时间需要 14 分钟。

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为要绘制的多边形数量为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);

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
(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/

你可能感兴趣的文章
log4cxx 的编译安装过程和使用
查看>>
简单邮件系统程序
查看>>
STL里的multimap使用详解
查看>>
STL 库其中的 std::string用法总结
查看>>
模态对话框的销毁过程与非模态对话的几种销毁方法
查看>>
C++实现http下载 && 24点计算编码风格
查看>>
memcached了解使用和常用命令详解
查看>>
GDB调试各功能总结
查看>>
"undefined reference to" 多种可能出现的问题解决方法
查看>>
类结构定义
查看>>
Windows下关于多线程类 CSemaphore,CMutex,CCriticalSection,CEvent,信号量CSemaphore的使用介绍
查看>>
图像处理基本算法(汇总)以及实现
查看>>
C++编程获取本机网卡信息 本机IP 包括Windows和Linux
查看>>
C++连接CTP接口实现简单量化交易
查看>>
服务端使用c++实现websocket协议解析及通信
查看>>
C# string.Format使用说明
查看>>
Linux下安装Mysql数据库开发环境
查看>>
Linux用户及用户组添加和删除操作
查看>>
通用 Makefile 的编写方法以及多目录 makefile 写法
查看>>
C++的4种智能指针剖析使用
查看>>