双目视觉学习笔记(一)--qtcreator下使用opencv读取并存储双摄像头图像
2016-09-14 21:25
911 查看
第一次写博文,主要是为了能够总结一下最近刚开始的关于双目视觉的研究,记录下每个阶段自己所做的工作,本文为前期的准备工作,主要实现了图像的采集功能。笔者使用qtcreator开发环境进行程序开发,opencv版本为2.4.9.
opencv的配置
工程架构简介
ui界面配置
具体功能实现
摄像头显示部分
图像保存
效果展示
完整工程下载地址
由于Qt中支持的是RGB图像, OpenCV中支持的是BGR故在打开摄像头并获取图像后需要对图像进行对应的转换方可以正常在label中显示,转换后使用update()触发paintEvent虚函数进行重绘对应代码为:
代码中包含了灰度转化的部分,通过一个flag进行切换,灰度转化代码只需要对这个flag取反即可:
至于关闭摄像头的功能只需要关闭计时器即可停止刷新显示,重新点击打开摄像头则可以重新进行显示,相关代码如下:
4000
目录
目录opencv的配置
工程架构简介
ui界面配置
具体功能实现
摄像头显示部分
图像保存
效果展示
完整工程下载地址
opencv的配置
qtcreator配置外部库的时候只需要在.pro文件中增加本地头文件和库文件的目录即可,至于dll文件则需要在系统中添加环境变量或者放入工程目录下。工程架构简介
工程的最终目的是实现双目视觉的测量,所以针对这一目的针对各部分功能进行了划分,wainwindow部分为主界面,所有涉及到针对ui的操作的信号和槽函数都会在对应的头文件和源文件中进行声明和实现,在本文实现的功能中摄像头的开关以及,camera部分为对于获取图像的处理部分,现如今包含图像灰度化和照片保存的功能。ui界面配置
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<<ImgCount; string scount = stemp.str(); //拼接字符串为完整存储路径 string str="F:\\Code\\QT\\CoCamera\\pic\\left\\CamL_"; str += scount; str += ".jpg"; //右摄像头图片存储路径 //将计数的整型转换成string stringstream stempr; stempr<<ImgCount; string scountr = stempr.str(); //拼接字符串为完整存储路径 string strr="F:\\Code\\QT\\CoCamera\\pic\\right\\CamR_"; strr += scountr; strr += ".jpg"; //QString qstr = QString::fromStdString(str); //ui->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/96308404000
相关文章推荐
- OpenCV学习笔记(15)使用OpenGL显示双目视觉三维重构效果 (转)
- OpenCV学习笔记 利用MFC的Picture控件显示图像+播放视频和捕获摄像头画面 .
- 使用JavaCV/OpenCV抓取并存储摄像头图像
- Opencv学习笔记(三):图像的使用与操作_颜色空间的变换
- 【OpenCV学习笔记】【编程实例】一(VS2010/MFC+OPenCV2.4.7读取图片和摄像头)
- OpenCV学习笔记——使用OpenCV访问图像数据
- OpenCV学习笔记2:使用opencv进行图像比较
- OpenCV学习笔记(8)VS2008 MFC下使用OpenCV2.0进行简单图像处理
- Opencv学习笔记(2)模块,图像读取、显示、叠加、融合、颜色分离、亮度、对比度
- 【OpenCV学习笔记】【函数学习】二(MFC+OpenCV2.4.7读取摄像头之CvvImage::CopyOf 的通道选择问题)
- OpenCV学习笔记(9)利用MFC的Picture控件显示图像+播放视频和捕获摄像头画面
- OpenCV学习笔记(9)利用MFC的Picture控件显示图像+播放视频和捕获摄像头画面
- OpenCV学习笔记---- 挨个读取图像文件夹下的所有文件,进行样本训练
- OpenCV(C++接口)学习笔记1-图像的读取、显示、保存
- 我的OpenCV学习笔记(18):使用Sobel变化和拉普拉斯变换检测图像边沿
- OpenCV 2 学习笔记(21): 使用直方图比较检索相似图像
- OpenCV学习笔记(13)基于OpenCV2.1的MFC双目视觉平台构建
- 笔记:OpenCV 读取摄像头并显示图像的R、G、B三个通道的直方图
- OpenCV学习笔记(16)双目测距与三维重建的OpenCV实现问题集锦(一)图像获取与单目定标
- 【OpenCV学习笔记】【函数学习】一(MFC+OpenCV2.4.7读取摄像头之cvCaptureFromCAM()的索引问题