工程链接:
链接:https://pan.baidu.com/s/1SZFH9F8oVYtAEp8NQDGoRA?pwd=6pep
提取码:6pep
注意将MVS目录下的Development下的include和libraries文件复制粘贴以后替换该工程下的同名文件
- 工程的总体构成介绍
图1 工程构成
如图一所示,主要由三个类来实现完整的功能,分别是mycamera,thread,widget类,mycamera类主要实现海康威视摄像头的打开,读取一帧图像,获取摄像头参数,关闭设备的功能,负责最初始的采集图像。Thread类主要是实现多线程抓取图像的功能。而widget类主要涉及到很多信号与槽函数的实现,其功能如图二和图三。
图二 图三
这些函数目的是要实现一下ui界面的功能。(如图四)
(图四)
2.功能效果演示
2.1打开摄像头
2.2获取摄像头截图
2.3开始标定
2.4矫正图像
2.5测量面积
6
2.6测量周长
3功能函数原理解析
3.1打开摄像头
//打开摄像头
connect(ui->btnOpencamera,&QPushButton::clicked,this,&Widget::on_opencamera_clicked);
EnumDevices函数可以搜寻到MVS海康威视相机。然后创建mycamera类,调用其中封装的打开摄像机函数,若打开成功则m_bOpenDevice设为true且检测到的摄像头指不设为空指针,这两个标识主要用于后期截取摄像头图片时的启动条件。此时由于截取图像和打开摄像头都需要显示图片,所以这里又设置了一个connect,将其连接到显示QImage图像函数slotDisImg,其中涉及到将opencv图像转换为QImage图像,并显示到label中。
3.2截取摄像头图片
//保存截图
connect(ui->btnsaveImg,&QPushButton::clicked,this,&Widget::slotBtnsaveImg);若点击获取截图按钮,则将m_saveImage保存表示设位真,并利用QFileDialog::getSaveFileName句柄可选择路径保存图片。
3.3开始标定
//点击“开始检测”,显示角点的亚像素
connect(ui->btnStartDetect,&QPushButton::clicked,this,&Widget::slotBtnStartDetect);
先将图像转为灰度图,然后寻找角点,再然后便利寻找到的角点并画圆以显示角点。
3.4矫正图片
//显示校正后的结果
connect(ui->btnShowResult,&QPushButton::clicked,this,&Widget::slotBtnShowResult);
下图是
先用matlab标定以后得到相机参数和畸变系数,然后手动输入相机参数和畸变系数,用opencv中的undistort矫正图片(图五是用matlab标定相机以后导出的.xml文件图片)。由于矫正的图像是极有价值的,所以这里默认保存矫正后的图片,有QT中自带的句柄选择矫正图片的保存路径。
3.5测量面积
//检测面积
connect(ui->btnArea,&QPushButton::clicked,this,&Widget::slotBtnArea);
先对图像进行预处理,预处理如下:高斯滤波进行降噪,然后对图像进行二值化,在对图像进行形态学操作以后,使用阈值分割,再使用findContours找到轮廓,然后对轮廓求面积,其中要遍历所有轮廓,找到最大轮廓的面积。
3.6测量周长
//检测周长
connect(ui->btnPerimeter,&QPushButton::clicked,this,&Widget::slotBtnPerimeter);
操作步骤如5.5一致,只是计算轮廓周长和计算轮廓面积的函数不同罢了。
3.7关闭摄像头
//关闭摄像头
connect(ui->btnCloseCamera,&QPushButton::clicked,this,&Widget::on_closecamera_clicked);
主要是调用mycamera类中关闭相机的函数,再将打开摄像头时的m_pMvCamera设为空指针,将m_bOpenDevice设为false,这两步主要是为下一次开启摄像头做准备.
4
.关键函数一览