文章目录
#OpenCV
OpenCV是一个做图像处理的库,可以用C++,Java,Python来写图像处理的程序,比如图像滤波,变换,检测之类的,我们主要用vs2015+OpenCV3.1做图像处理。
##安装
- 下载安装OpenCV,需要注意的是OpenCV版本要与vs版本对应,判断方法是\opencv\build\x64\vs数字,数字14对应vs2015,13对应vs2014以此类推,配置环境变量与VS的配置项目属性各种路径。
- 新建一个c++空项目,注意是空项目,然后在源文件里建cpp文件,写程序就行了,写程序需要注意include库与引用命名空间,这里的库有两个版本,debug(调试版本)与release(发布版本),简单的区别就是前者运行慢,但更利于调试观察,代码少,偏研究可以选这个,后者运行快,因为进行了很多优化,代码多要求效率可以用这个。
- 写完程序运行测试就好了,但是c++如果同时有两个带main函数的cpp源文件会报错,保证同时只有一个带main函数的源文件,其余的先移除。
##程序
写上第一个测试程序
Mat image = imread("xxx.jpg", 1);//1是一通道,不填默认三通道
imshow("窗口名",image);//显示图片
再写一个调用电脑摄像头的
Mat image, outputImg;
char* window_name = "调用摄像头";
VideoCapture capture;
capture.open(0);
if (capture.isOpened())
{
for (;;)
{
cout << "已开启摄像头" << endl;
capture >> image;
if (image.empty())
break;
imshow(window_name, image);
if (waitKey(10) >= 0)
break;
}
}
else
{
cout << "没有摄像头" << endl;
image = Mat::zeros(480, 640, CV_8UC1);
imshow("Sample", image);
waitKey(0);
}
##常用数据结构
- Mat:图像对象
- Point2f:二维点 如:
Point2f p(2,3)
定义一个二维点p,调用p.x和p.y - Point3f:三维点 如:
Point2f p(2,3,4)
定义一个三维点p,调用p.x和p.y和p.z - Scalar(B,G,R):颜色表示,注意RGB反着
- Size:尺寸 如Size(3,5),宽和高为3和5
- Rect:矩形 如Rect(x,y,width,height),x,y表示矩形左上角点的坐标,后两个表示矩形的宽和高
#Qt
当你写完图像处理项目后你可能想要做一个图形界面,c++可以用MFC比较过时了,所以我们用Qt,Qt有个优势是嵌入式做界面很多都用。顺便说下,Qt和OpenCV都是框架不是语言,仅仅是include库,所以他们都放到一个C++项目里就行。也就是说同一个cpp文件可以同时引用OpenCV和Qt库,可以在一个文件里编程。
##Qt+VS环境配置
需要1.Qt,2.VS在线工具搜索Qt安装插件3.VS
- 在这里[https://www.qt.io/download-open-source/]下载Qt
Qt 版本 for Windows 32/64-bit (VS 版本, xxx MB),注意vs版本对应,Windows系统与位数对应 - 然后配置PATH环境变量Qt\Qt5.7.0\5.7\msvc2015_64\bin我的是2015所以msvc2015
- VS中安装好Qt插件之后,先点击Qt,Qt option配置路径,路径选到msvx那,名字任意起
- 新建项目,选Qt->第一个项目,默认设置,->finish,然后说下Qt项目主要结构
##Qt结构
需要注意,新建项目可能会提示include的文件找不到,不用管,直接正常编译就好,如果还报错,可以把Qt安装文件中的include文件夹整个复制到项目里。
cpp类(包含.h与cpp文件,C++类的写法可以看其他博文)与一个cpp main文件和一个.ui文件,其中main文件不用写啥,主要是打开窗口,.ui文件就是xml文件,当你用Qt Designer控件后ui文件自动生成。
主要的逻辑写到cpp类里,主要有两类,一类获取控件赋值取值,一类是事件处理,获取控件方法:
ui.label->setText("内容");
ui直接写就行,Label是你拖的控件的objectName,C++方法用->,属性用‘.’。
事件处理用信号与槽,设定信号发送者(控件),信号(比如点击,滑过),接受者(cpp类),槽(cpp类里的方法),其中信号和槽都有默认的选项,如果想自定义槽,可以以如下格式在类里写主要是声明时加上slots:
//.h文件声明
private slots:
void test();
//类文件实现
void MyClass::imgProcess()
{};
自定义槽写好后,直接在.ui文件里把方法名写上就行了,需要先用默认的生成一下,然后你看一下格式就知道怎么改了。
如果Qt界面中文乱码了,在文件最上面写上这句话,记住只要遇到编码问题都设置成UTF-8:
# pragma execution_character_set("UTF-8")