双目视觉学习笔记--qtcreator下使用opencv读取并存储双摄像头图像

第一次写博文,主要是为了能够总结一下最近刚开始的关于双目视觉的研究,记录下每个阶段自己所做的工作,本文为前期的准备工作,主要实现了图像的采集功能。笔者使用qtcreator开发环境进行程序开发,opencv版本为2.4.9.
##目录

文章目录


##opencv的配置
qtcreator配置外部库的时候只需要在.pro文件中增加本地头文件和库文件的目录即可,至于dll文件则需要在系统中添加环境变量或者放入工程目录下。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sDfNi9ic-1596266900514)(http://i.imgur.com/mhXShZE.png)]

##工程架构简介
工程的最终目的是实现双目视觉的测量,所以针对这一目的针对各部分功能进行了划分,wainwindow部分为主界面,所有涉及到针对ui的操作的信号和槽函数都会在对应的头文件和源文件中进行声明和实现,在本文实现的功能中摄像头的开关以及,camera部分为对于获取图像的处理部分,现如今包含图像灰度化和照片保存的功能。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k21Fo9u0-1596266900516)(http://i.imgur.com/gidTtNu.png)]

##ui界面配置
ui部分,设置了两个groupbox作为显示的容器,通过label显示图像,两个label的名字分别为img_label和img_label2,下设4个按钮,名称分别为close_camera,open_camera,save_camera以及gray_camera。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WYP8LYvE-1596266900518)(http://i.imgur.com/Uubdxim.png)]

##具体功能实现
这部分则详细说明一下各部分功能的实现方式
###摄像头显示部分
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/9630840

  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值