第一次写博文,主要是为了能够总结一下最近刚开始的关于双目视觉的研究,记录下每个阶段自己所做的工作,本文为前期的准备工作,主要实现了图像的采集功能。笔者使用qtcreator开发环境进行程序开发,opencv版本为2.4.9.
qtcreator配置外部库的时候只需要在.pro文件中增加本地头文件和库文件的目录即可,至于dll文件则需要在系统中添加环境变量或者放入工程目录下。
工程的最终目的是实现双目视觉的测量,所以针对这一目的针对各部分功能进行了划分,wainwindow部分为主界面,所有涉及到针对ui的操作的信号和槽函数都会在对应的头文件和源文件中进行声明和实现,在本文实现的功能中摄像头的开关以及,camera部分为对于获取图像的处理部分,现如今包含图像灰度化和照片保存的功能。
ui部分,设置了两个groupbox作为显示的容器,通过label显示图像,两个label的名字分别为img_label和img_label2,下设4个按钮,名称分别为close_camera,open_camera,save_camera以及gray_camera。
这部分则详细说明一下各部分功能的实现方式
camera头文件中定义了用于打开摄像头的VideoCapture类类型变量videoCapL和videoCapR分别打开左右两个摄像头,该类在opencv的highgui.h中定义,打开后摄像头后会将获得的图像存入mat变量,同时开启一个计时器theTimer用于触发界面重绘,打开摄像头的函数代码如下所示。
void MainWindow::open_camera()
{
//---从摄像头捕获视频---
ui->save_camera->setEnabled(1);//激活按键
ui->close_camera->setEnabled(1);//激活按键
if(cam->videoCapL.open(0))
{
cam->srcImageL = Mat::zeros(cam->videoCapL.get(CV_CAP_PROP_FRAME_HEIGHT), cam->videoCapL.get(CV_CAP_PROP_FRAME_WIDTH), CV_8UC3);
if(cam->videoCapR.open(1))
{
cam->srcImageR = Mat::zeros(cam->videoCapR.get(CV_CAP_PROP_FRAME_HEIGHT), cam->videoCapR.get(CV_CAP_PROP_FRAME_WIDTH), CV_8UC3);
theTimer.start(33);
}
}
}
由于Qt中支持的是RGB图像, OpenCV中支持的是BGR故在打开摄像头并获取图像后需要对图像进行对应的转换方可以正常在label中显示,转换后使用update()触发paintEvent虚函数进行重绘对应代码为:
void MainWindow::updateImage()
{
//---刷新显示---
//显示彩色照片
if(cam->Gray_Flag == 0)
{
cam->videoCapL>>cam->srcImageL;
if(cam->srcImageL.data)
{
cvtColor(cam->srcImageL, cam->srcImageL, CV_BGR2RGB);//Qt中支持的是RGB图像, OpenCV中支持的是BGR
cam->videoCapR>>cam->srcImageR;
if(cam->srcImageR.data)
{
cvtColor(cam->srcImageR, cam->srcImageR, CV_BGR2RGB);//Qt中支持的是RGB图像, OpenCV中支持的是BGR
this->update(); //发送刷新消息,重绘
}
}
}
else
{
cam->videoCapL>>cam->srcImageL;
if(cam->srcImageL.data)
{
cvtColor(cam->srcImageL, cam->srcImageL, CV_BGR2GRAY);//左摄像头帧转化为灰度图
cam->videoCapR>>cam->srcImageR;
if(cam->srcImageR.data)
{
cvtColor(cam->srcImageR, cam->srcImageR, CV_BGR2GRAY);//右摄像头帧转化为灰度图
this->update(); //发送刷新消息
}
}
}
}
void MainWindow::paintEvent(QPaintEvent *e)
{
if(cam->Gray_Flag == 0)
{
//显示左摄像头彩色帧
QImage imagel = QImage((uchar*)(cam->srcImageL.data), cam->srcImageL.cols, cam->srcImageL.rows, QImage::Format_RGB888);
ui->img_label->setPixmap(QPixmap::fromImage(imagel));
ui->img_label->resize(imagel.size());
ui->img_label->show();
//显示右摄像头彩色帧
QImage imager = QImage((uchar*)(cam->srcImageR.data), cam->srcImageR.cols, cam->srcImageR.rows, QImage::Format_RGB888);
ui->img_label2->setPixmap(QPixmap::fromImage(imager));
ui->img_label2->resize(imager.size());
ui->img_label2->show();
}
else
{
//显示左摄像头灰度帧
QImage imagel = QImage((uchar*)(cam->srcImageL.data), cam->srcImageL.cols, cam->srcImageL.rows,cam->srcImageL.step, QImage::Format_Indexed8);
ui->img_label->setPixmap(QPixmap::fromImage(imagel));
ui->img_label->resize(imagel.size());
ui->img_label->show();
//显示右摄像头灰度帧
QImage imager = QImage((uchar*)(cam->srcImageR.data), cam->srcImageR.cols, cam->srcImageR.rows,cam->srcImageR.step, QImage::Format_Indexed8);
ui->img_label2->setPixmap(QPixmap::fromImage(imager));
ui->img_label2->resize(imager.size());
ui->img_label2->show();
}
}
代码中包含了灰度转化的部分,通过一个flag进行切换,灰度转化代码只需要对这个flag取反即可:
void Camera::convert2gray()
{
Gray_Flag = !Gray_Flag;
}
至于关闭摄像头的功能只需要关闭计时器即可停止刷新显示,重新点击打开摄像头则可以重新进行显示,相关代码如下:
void MainWindow::close_camera()
{
//---关闭摄像头---
theTimer.stop(); // 停止触发刷新。
ui->close_camera->setEnabled(0); //重新锁定按键
}
图像保存就不必多说了,使用opencv中的imwrite即可,代码如下:
void Camera::save_camera()
{
//---保存数据帧---
//左摄像头图片存储路径
//将计数的整型转换成string
stringstream stemp;
stemp<label_test->setText(qstr);
imwrite(str,srcImageL);
imwrite(strr,srcImageR);
//imwrite("F:\\Code\\QT\\CoCamera\\pic\\left\\ImgR.jpg",srcImageR);
ImgCount++;
}
http://download.csdn.net/detail/qq_21539825/9630840