工程链接:

        链接:https://pan.baidu.com/s/1SZFH9F8oVYtAEp8NQDGoRA?pwd=6pep 
提取码:6pep

        注意将MVS目录下的Development下的include和libraries文件复制粘贴以后替换该工程下的同名文件

  1. 工程的总体构成介绍

python 海康 手动抓图 api 海康威视抓图计划_mvc

图1  工程构成

如图一所示,主要由三个类来实现完整的功能,分别是mycamera,thread,widget类,mycamera类主要实现海康威视摄像头的打开,读取一帧图像,获取摄像头参数,关闭设备的功能,负责最初始的采集图像。Thread类主要是实现多线程抓取图像的功能。而widget类主要涉及到很多信号与槽函数的实现,其功能如图二和图三。

python 海康 手动抓图 api 海康威视抓图计划_python 海康 手动抓图 api_02

python 海康 手动抓图 api 海康威视抓图计划_mvc_03

                                    图二                                                                                图三

这些函数目的是要实现一下ui界面的功能。(如图四)

python 海康 手动抓图 api 海康威视抓图计划_mvc_04

(图四)

2.功能效果演示

2.1打开摄像头

python 海康 手动抓图 api 海康威视抓图计划_mvc_05

2.2获取摄像头截图

python 海康 手动抓图 api 海康威视抓图计划_ui_06

2.3开始标定

python 海康 手动抓图 api 海康威视抓图计划_qt_07

2.4矫正图像

python 海康 手动抓图 api 海康威视抓图计划_mvc_08

2.5测量面积

python 海康 手动抓图 api 海康威视抓图计划_python 海康 手动抓图 api_09

6

2.6测量周长

python 海康 手动抓图 api 海康威视抓图计划_角点_10

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中自带的句柄选择矫正图片的保存路径。

python 海康 手动抓图 api 海康威视抓图计划_qt_11

             

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

.关键函数一览

python 海康 手动抓图 api 海康威视抓图计划_mvc_12

python 海康 手动抓图 api 海康威视抓图计划_python 海康 手动抓图 api_13

python 海康 手动抓图 api 海康威视抓图计划_mvc_14

python 海康 手动抓图 api 海康威视抓图计划_python 海康 手动抓图 api_15

python 海康 手动抓图 api 海康威视抓图计划_ui_16