本人纯小白一只,刚接触C++和opencv不久,网上好多资料都是相机和opencv结合的资料,走了好多弯路,因此决定从最简单的开始一步步的摸索,把自己的源码发上来和大家交流。
一:准备工作
相机:映美精
编译环境:VS2015+QT5.7.1
相机IP分配和相机类库:GigECam IP Configuration和IC Imaging Control 3.4
二:相机控制类简介
主要使用Grabber类,它提供了控制从源(视频捕获设备)到接收器(图像缓冲区或媒体文件的集合)的图像流中的图像缓冲区流的基本功能。可以打开和关闭实时图像,并提供标准帧抓取功能。
头文件:tisudshl.h
命名空间:DShowLib
三:代码
QT界面设计:
两个按钮:StartButton和EndButton
一个label:DisplayLabel
label大小是我根据相机成像大小等比例缩放的,我用的相机分辨率是1280×960,label大小为640×480,你也可以设置为自适应大小,。
设置包含库文件,在QT.pro文件最后加入下面两行代码(将xxx改为你的电脑用户名):
#添加相机库文件
#$$quote关键字是为了加入带空格的路径
INCLUDEPATH += $$quote(C:\Users\asus\Documents\IC Imaging Control 3.4\classlib\include)
LIBS += $$quote(C:\Users\xxx\Documents\IC Imaging Control 3.4\classlib\x64\debug\TIS_UDSHL11d_x64.lib)
在MyWidget.h头文件中加入相机类库头文件并创建指向该类的指针,槽函数在UI设计中使用转到槽生成:
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
#include "tisudshl.h"
namespace Ui {
class MyWidget;
}
class MyWidget : public QWidget
{
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = 0);
~MyWidget();
DShowLib::Grabber* m_pGrabber;
private slots:
void on_StartButton_clicked();
void on_EndButton_clicked();
private:
Ui::MyWidget *ui;
};
#endif // MYWIDGET_H
在主函数main.cpp中添加初始化函数。主函数如下:
#include "MyWidget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
if (!DShowLib::InitLibrary()) //相机控制初始化函数,必须在程序初始化时调用,调用成功返回True否则返回false
{ return FALSE; }
atexit(DShowLib::ExitLibrary); //注册终止函数(即main执行结束后调用的函数)
QApplication a(argc, argv);
MyWidget w;
w.show();
return a.exec();
}
主程序MyWidget.cpp如下(英文注释是官方解释,中文注释是我的一些理解和翻译):
#include "MyWidget.h"
#include "ui_MyWidget.h"
#include<QLabel>
#include<QMessageBox>
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
ui->setupUi(this);
//Constructs a new Grabber object
m_pGrabber = new DShowLib::Grabber();//创建Grabber对象
assert(m_pGrabber); //如果创建失败程序报错
}
MyWidget::~MyWidget()
{
delete ui;
delete m_pGrabber;//手动释放
}
//使用内置对话框选择视频捕捉设备选择视频捕捉设备
void MyWidget::on_StartButton_clicked()
{
//分配空间
DShowLib::Grabber* pGrabber =m_pGrabber;
// Show the device page.
pGrabber->showDevicePage();//bool类型,显示设备设置界面
// Check if there is a valid device.
if (pGrabber->isDevValid())//如果有可获取的设备则开始显示
{
//QT中获取label控件的窗口句柄
HWND appwnd;
appwnd = (HWND)ui->DisplayLabel->winId();
// Set the window that should display the live video.
pGrabber->setHWND(appwnd);//指定窗口句柄
/*setWindowSize()定义视频显示窗口的大小,setDefaultWindowPosition如果设为True,则
视频只能按照真实大小显示,所以在改变视屏显示窗口大小时必须设置为false*/
//Enables or disables the default window size lock of the video window.
pGrabber->setDefaultWindowPosition(false);
//Sets the size of the video window.
pGrabber->setWindowSize(ui->DisplayLabel->width(),ui->DisplayLabel->height());
// Start the live video.
pGrabber->startLive();
}
else
{
QMessageBox::warning(NULL, "warning", "No device was selected",
QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes);
}
}
//结束显示
void MyWidget::on_EndButton_clicked()
{
// Stops the grabber .
m_pGrabber->stopLive();
// Closes the currently active video capture device.
m_pGrabber->closeDev();
}
最终结果如下:
下面再把多相机选择和拍照存储搞一搞就可以开始标定和三维重建了。。
遇到的问题:
我在编译时遇到TIS_UDSHL11d_x64.dll文件不存在,在相机库文件所在文件夹中找到该文件复制到C:\Windows\SysWOW64和system32中即可,不知道最近电脑抽什么风,前段时间装MSDN也会出这个问题。
欢迎大家指正和交流。