1、OpenCV(Open Source Computer Vision)
- 最初由Intel 开发,第一版发布于2000年。第一次实现用的C语言,从2.0版本开始用C++。OpenCV 有支持JAVA、Python、MATLAB等语言的API,支持Linux、OS X、Windows、Android、iOS等操作系统。
- 支持图片格式:bmp、dib;pbm、pgm、ppm;sr、ras。需要辅助库支持格式:jpeg、jpg、jpe;jp2;png;tif、tiff;webp。
2、Mat类
- 是存储和操作OpenCV中图像的主要数据结构。这个类在core模块中定义。已实现自动分配和释放机制,但赋值运算符没有重载,需要用成员函数Mat::clone()。
- 用于密集的n维单通道或多通道数组,可以用于存储 实数、复数或复数值向量和矩阵、彩色图像或灰度图像、直方图、点云(point cloud)等
- 构造函数:Mat( nrows , ncols , type , fillValue )
3、示例代码
- opencv.hpp 包含所有OpenCV头文件。
- imread原型:Mat imread(const String& filename, int flags=IMREAD_COLOR)。
- imread的flag有以下几种
enum{
IMREAD_UCHANGED=-1, //8位,彩色或非彩色,存储图像不会改变
IMREAD_GRAYSCALE=0, //8位,灰度
IMREAD_COLOR=1, //未改变深度、颜色
IMREAD_ANYDEPTH=2, //任意深度,未改变颜色
IMREAD_ANYCOLOR=4, //未改变深度,任意颜色
IMREAD_LOAD_GDAL=8 //使用gdal驱动程序
}
- 创建窗口函数原型:void nameWindow(const String& winname,int flag=WINDOW_AUTOSIZE);
- nameWindow的flag有以下几种
enum{
WINDOW_NORMAL=0x00000000, //用户可调整窗口大小,还可以将一根全屏窗口切换为常规窗口
WINDOW_AUTOSIZE=0x00000001, //用户不能调整窗口大小,图像大小由显示图像所限制
WINDOW_OPENGL=0x00001000, //OpenGL支持的窗口
WINDOW_FULLSCREEN=1,
WINDOW_FREERATIO=0x00000100, //图像可任意使用(调整时没有比例限制)
WINDOW_KEEPRATIO=0x00000100, //调整时保持缩放比例
}
- imshow原型:void imshow(const String& winname,InputArray mat)
- 如果在一个窗口上显示一个图像后不再做任何事情,我们看不到图像。所以需要循环执行一个任务的函数来保持显示。
- int waitKey(int delay=0) 在delay时间(单位ms)内等待一个按键操作,并返回按键编码;如延迟结束没按键返回-1。如果delay是0或负数,函数会一直等待。(需至少创建和激活一个窗口,函数才会工作)
- imwrite函数原型:bool imwirte(const String& filename , InputArray img , const vector<int>& params=vector<int>()) 第三个参数可选
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int,char *argv[])
{
Mat in_image, out_image;
//读取原始图像
in_image = imread("test.jpg", IMREAD_UNCHANGED);
if (in_image.empty()) {
cout << "Error!";
return -1;
}
//创建两个具有图像名称的窗口
namedWindow("Color", WINDOW_AUTOSIZE);
namedWindow("Gray", WINDOW_AUTOSIZE);
//在创建的窗口中显示原始图片
imshow("Color", in_image);
//转换为灰度图并显示
cvtColor(in_image, out_image, COLOR_BGR2GRAY);
imshow("Gray", out_image);
//等待按键
//cout << "Press any key to exit." << endl;
waitKey();
imwrite("out.jpg", in_image);
return 0;
}
4、用户交互
- 用createTrackbar(const String& trackbarname,const String& winname, int* value,int count,TrackbarCallback onChange=0,void* userdata=0) 创建滑动条,链接整数值value、最大值count
- 绘制一个矩形void rectangle(InputOutputArray img,Point pt1,Point pt2,const Scalar& color,int thickness=1,int lineType=LINE_8,int shift=0)
5、其他
- 记得命名空间的声明,using namespace cv;
6、参考资料
《OpenCV 图像处理》Gloria Bueno Garcia、Oscar Deniz Suarez、Jose Luis Espinosa Aranda著,刘冰 翻译,机械工业出版社出版,2016年11月