一、放在前面:

1.Linux下创建文件:
可以使用VI创建 vi temp.txt
可以用 touch xxx.cpp

2.该如何运行该c程序呢?
方法一:
命令gcc + c程序名 + -o +生成的可执行程序名
命令gcc是编译该c文件,-o是在当前目录下,生成可执行程序aa

c文件:gcc -o img_1 img_1.c pkg-config --cflags --libs opencv
cpp文件:g++ -o imgshow imgshow.cpp pkg-config --cflags --libs opencv
(–cflags:用来指定程序在编译时所需要头文件所在的目录
–libs:用来指定程序在链接时所需要的动态链接库的目录)
注意:pkg-config opencv —cflags —libs外面的引号是键盘左上角1旁边的那个引号

方法二:使用Cmake
step1:新建一个目录用于存放我们的代码和程序中要处理的相关图片。
step2:添加cmake工具编译时所需的文件CMakeLists.txt。
Step3:输入命令 cmake . 再输入make 得到可执行程序
具体参考:https://blog.csdn.net/u012424737/article/details/80524278
**

二、常用的库函数

各模块常用库函数:
https://www.cnblogs.com/ybqjymy/p/12801655.html

imread() 读取图片:
eg:Mat src=imread(“lena.jpg”,CV_LOAD_IMAGE_COLOR); //第二个参数可以指定读取灰度图/彩色图

if(char(waitKey(1))==’a’) // 读取按键值

cvtcolor函数 用于在图像中不同的色彩空间进行转换
其C++接口为:**

  1. 1. void cv::cvtColor (InputArray src, //输入
  2. 2. OutputArray dst, //输出
  3. 3. int code,
  4. 4. int dstCn = 0
  5. 5. )

Mat点阵类型,以像素形式缓存图片
convertTo()像素转换函数 OpenCV增强图片使用的是点算子,即用常数对每个像素点执行乘法和加法的复合运算,g(i,j)=αf(i,j)+β α:控制对比度 β:控制亮度

图像的二值化:**就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的只有黑和白的视觉效果。
二值化处理函数:**

  1. retval, dst = cv2.threshold(img, threshold, maxval,type)
  2. //threshold是设定的阈值
  3. //img 原图像 dst 处理得到的图像
  4. // maxval是当灰度值大于(或小于)阈值时将该灰度值赋成的值

重点了解:type规定的是当前二值化的方式
OpenCV学习笔记 - 图1(原灰度值分布)

  • cv2.THRESH_BINARY 大于阈值的部分被置为255,小于部分被置为0

OpenCV学习笔记 - 图2 (处理后)

  • cv2.THRESH_BINARY_INV 大于阈值部分被置为0,小于部分被置为255

    OpenCV学习笔记 - 图3

  • cv2.THRESH_TRUNC 大于阈值部分被置为threshold,小于部分保持原样

OpenCV学习笔记 - 图4

  • cv2.THRESH_TOZERO 小于阈值部分被置为0,大于部分保持不变

    OpenCV学习笔记 - 图5

  • cv2.THRESH_TOZERO_INV 大于阈值部分被置为0,小于部分保持不变

OpenCV学习笔记 - 图6


videocapture 函数 获取视频

inRange( ) 可同时多通道进行二值化操作
接口:

  1. void inRange(InputArray src, InputArray lowerb,
  2. InputArray upperb, OutputArray dst);
  3. 参数1:输入要处理的图像,可以为单通道或多通道。
  4. 参数2:包含下边界的数组或标量。
  5. 参数3:包含上边界数组或标量。
  6. 参数4:输出图像,与输入图像src尺寸相同且为CV_8U类型。

calcHist( ) 用直方图统计像素
接口:

  1. CV_EXPORTS void calcHist( const Mat* images, /// 源图像
  2. int nimages, ///源图像的个数
  3. const int* channels, /// 列出通道
  4. InputArray mask, /// 输入掩码
  5. OutputArray hist, ///输出直方图
  6. int dims, /// 直方图维度(通道数量)
  7. const int* histSize, ///每个维度位数
  8. const float** ranges, ///每个维度范围
  9. bool uniform = true, ///true表示箱子间距相等
  10. bool accumulate = false ); /// 是否在多次调用时进行累加

直方图是一个简单的表格,每个像素放在一个箱子里面
对一副 灰度图 进行直方图处理的一般步骤(调用OpenCV库函数)

  • 首先,创建灰度图像直方图 Histogram1D h;
  • 接下来计算直方图, Mat histo = h.getHistogram( image ) /// 获取直方图的函数

= h.getImageOfHistogram( image ) /// 该方法返回直方图的图像

三、常用数据类型

1.点的表示:Point类
Point类数据结构表示了二维坐标系下的点,有数据成员x,y。
用法:
Point p;
p.x = 1, p.y = 2;
或者:
Point p = Point(1, 2);
另外,在定义中Point_、Point2i和Point相互等价
Point_和Point2f相互等价

2.颜色的表示:Scalar类
Scalar()表示具有四个元素的数组,在opencv中通常用于传递与设置像素值,如RGB的颜色值。而RGB的颜色值为三个参数(三通道),对与Scalar函数来说,第四个参数可以忽略不写出。

eg:Scalar(a, b, c);//定义的RGB颜色值中红色分量为a,绿色分量为b,蓝色分量为a;
Scalar类的源头为Scalar类,而Scalar类是Vec4x的一个变种,常用的Scalar就是Scalar_。故函数参数的输入可以是Mat也可以使Scalar。**

3.尺寸表示类:Size类

在Size类相关源码中将Size_ 的别名定为Size和Size2i。
Size_的构造函数为:

Size_(_Tp _width, _Tp _height);
Size(const Size& sz);
Size_(const CvSize& sz);
Size_(const CvSize2D32f& sz);
Size(const Point<_Tp>& pt);
常用到的就是: Size_(_Tp _width, _Tp _height);
另外在该类中还定义了公共数据成员width、height,可直接调用。

4.矩形表示类:Rect类

Rect类的成员变量有x、y、width、height,分别为左上角点的坐标和矩形的长和高。
常用的成员函数有:
Size()——返回值为对应的Size对象
area()——返回矩形的面积
contains(Point)——判断点是否在矩形里
inside(Rect)——判断矩形是否在该矩形里
tl()——返回左上角点的坐标
br()——返回右下角的坐标
求两矩形交集:
Rect rect = rect1 & rect2;
求两矩形并集:
Rect rect = rect1 | rect2;
矩形平移:
Rect rectShift = rect + point;
矩形缩放:
Rect rect = rect1 + size;