qt:我h5调用摄像头拍照上传做拍照功能。摄像头的图像能显示,但是capture的功能上有问题

双目视觉学习笔记(一)--qtcreator下使用opencv读取并存储双摄像头图像
第一次写博文,主要是为了能够总结一下最近刚开始的关于双目视觉的研究,记录下每个阶段自己所做的工作,本文为前期的准备工作,主要实现了图像的采集功能。笔者使用qtcreator开发环境进行程序开发,opencv版本为2.4.9.
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();
//发送刷新消息,重绘
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();
//显示左摄像头灰度帧
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_F
至于关闭摄像头的功能只需要关闭计时器即可停止刷新显示,重新点击打开摄像头则可以重新进行显示,相关代码如下:
void MainWindow::close_camera()
//---关闭摄像头---
theTimer.stop();
// 停止触发刷新。
ui-&close_camera-&setEnabled(0);
//重新锁定按键
图像保存就不必多说了,使用opencv中的imwrite即可,代码如下:
void Camera::save_camera()
//---保存数据帧---
//左摄像头图片存储路径
//将计数的整型转换成string
stemp&&ImgC
string scount = stemp.str();
//拼接字符串为完整存储路径
string str="F:\\Code\\QT\\CoCamera\\pic\\left\\CamL_";
str += ".jpg";
//右摄像头图片存储路径
//将计数的整型转换成string
stempr&&ImgC
string scountr = stempr.str();
//拼接字符串为完整存储路径
string strr="F:\\Code\\QT\\CoCamera\\pic\\right\\CamR_";
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++;
完整工程下载地址
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!网站已改版,请使用新地址访问:
video qt摄像头视频采集程序, 数据,显示到qt界面上! Capture 捉/
263万源代码下载- www.pudn.com
&文件名称: video& & [
& & & & &&]
&&所属分类:
&&开发工具: QT
&&文件大小: 6 KB
&&上传时间:
&&下载次数: 409
&&提 供 者:
&详细说明:qt摄像头视频采集程序,采集摄像头视频数据,显示到qt界面上!-Qt camera video collection procedures, collect the camera video data, show to qt interface!
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&video&&.....\main.cpp&&.....\processImage.cpp&&.....\processImage.h&&.....\video.pro&&.....\video.pro.user&&.....\videodevice.cpp&&.....\videodevice.h
&[]:纯粹是垃圾&[]:一般,勉强可用
&近期下载过的用户:
&&&&&&&&&&&&&&&&&&&&&[]
&相关搜索:
&输入关键字,在本站263万海量源码库中尽情搜索:
&[] - This show how to combine opencv with qt
&[] - qt+openCV捕捉摄像头,最简单的摄像头图像采集程序仅供参考。
&[] - qt下开发的结合摄像头驱动程序,实现实时捕捉图像信号且可保存截图
&[] - 实现嵌入式视频监控的源代码,用Qt实现的。很好用哦
&[] - 利用video4linux2进行图像/视频采集的例子,带video4linux2文档,rtp传输
&[] - 在QT4下开发的视频采集及传输程序,可以在以太网下进行传输。同时可以抓取图像保存到本地存储器,系统还有图像查看及管理的功能
&[] - 基于pxa270平台及qt技术设计一个最简单照相机。包括qt界面设计,摄像头驱动程序移植,图像格式转换和保存。
&[] - 最基本的QT结合OPECNCV捕获摄像头程序,WINDOWS下调试通过!
&[] - 运用LINUX下的QT,实现视频实时监控功能,并可进行视频现场的播放,可直接下载到QT中运行摘要:在Linux环境下可以通过V4L2接口及ioctl相关函数直接在底层调用摄像头设备,进行摄像头控制及图像预览和捕获,但是该方法相对比较复杂;Qt5.0版本新增了QMultimedia模块提供了更为方便的编程支持,该模块主要涵盖视频、音频、收音机以及摄像头等功能支持,提供了非常多的QML类型和C++类用以处理多媒体内容,Qt 5将Qt Multimedia模块放在了核心模块中,因此它支持所有主要平台,这些类需要在 pro 文件中添加 QT += multimedia. 平台环境:Qt5.0.2,Qt Creator(ubuntu系统),笔记本自带摄像头. Step1:用Qt creator新建Qt Widgets Application工程 &按照提示下一步即可创建模板工程,如图,并修改.pro文件添加 QT +=multimedia,QT+=multimediawidgets项
&Step2:双击mainwindow.ui启动qt designer可视化布局界面 首先在布局左侧放置一个Horizental Layout控件,修改对象名为ImageView,用于图像预览显示;再在右侧放一个Vertical Layout 控件,依次在其中放置一个label和三个Push Button,修改label的对象名为ImageCapture,用于显示捕获的图像,修改按钮的显示名称及对象名分别为buttonCapture, buttonSave, buttonQuit,拖动控件到合适的布局,如图 &Step3:修改mainwindow.h 源码如下 &
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include &QMainWindow&
#include &QCamera&
#include &QCameraViewfinder&
#include &QCameraImageCapture&
#include &QFileDialog&
namespace Ui {
class MainW
class QCameraV
class QCameraImageC
class MainWindow : public QMainWindow
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void captureImage();
void displayImage(int,QImage);
void saveImage();
Ui::MainWindow *
QCameraViewfinder *
QCameraImageCapture *imageC
#endif // MAINWINDOW_H
Step4:修改mainwindow.cpp 源码如下 &
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
ui-&setupUi(this);
camera=new QCamera(this);
viewfinder=new QCameraViewfinder(this);
imageCapture=new QCameraImageCapture(camera);
ui-&ImageView-&addWidget(viewfinder);
ui-&ImageCapture-&setScaledContents(true);
camera-&setViewfinder(viewfinder);
camera-&start();
connect(imageCapture, SIGNAL(imageCaptured(int,QImage)), this, SLOT(displayImage(int,QImage)));
connect(ui-&buttonCapture, SIGNAL(clicked()), this, SLOT(captureImage()));
connect(ui-&buttonSave, SIGNAL(clicked()), this, SLOT(saveImage()));
connect(ui-&buttonQuit, SIGNAL(clicked()), qApp, SLOT(quit()));
MainWindow::~MainWindow()
void MainWindow::captureImage()
ui-&statusBar-&showMessage(tr("capturing..."), 1000);
imageCapture-&capture();
void MainWindow::displayImage(int , QImage image)
ui-&ImageCapture-&setPixmap(QPixmap::fromImage(image));
ui-&statusBar-&showMessage(tr("capture OK!"), 5000);
void MainWindow::saveImage()
QString fileName=QFileDialog::getSaveFileName(this, tr("save file"), QDir::homePath(), tr("jpegfile(*.jpg)"));
if(fileName.isEmpty()) {
ui-&statusBar-&showMessage(tr("save cancel"), 5000);
const QPixmap* pixmap=ui-&ImageCapture-&pixmap();
if(pixmap) {
pixmap-&save(fileName);
ui-&statusBar-&showMessage(tr("save OK"), 5000);
Step5:编译工程效果如下
总结:QCamera类封装了很多底层操作,为了更进一步地了解Linux下摄像头的调用机制,我将在后续探讨V4L2及ioctl操作摄像头的机理。
阅读(...) 评论()Qt调用摄像头(截取并保存图片)
& & Qt如何调用系统摄像设备进行显示、截图、录制?
& & QCamera:系统摄像设备(摄像头)
QCameraViewfinder:摄像取景器部件
QCameraImageCapture:截图部件
capture按钮:用于截图(截图后在右上角显示)
save按钮:用于保存截取后的图片(此处测试路径为:F:\a.jpg)
exit按钮:退出界面
效果如下:
代码如下:
#include "test_capture.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent)
this-&resize(600, 400);
camera = new QCamera();
view_finder = new QCameraViewfinder();
camera_image_capture = new QCameraImageCapture(camera);
capture_button = new QPushButton();
save_button = new QPushButton();
exit_button = new QPushButton();&
display_label = new QLabel();
QHBoxLayout *main_layout = new QHBoxLayout();
QVBoxLayout *v_layout = new QVBoxLayout();
display_label-&setFixedSize(150, 150);
display_label-&setScaledContents(true);
v_layout-&addWidget(display_label);
v_layout-&addStretch();
v_layout-&addWidget(capture_button);
v_layout-&addWidget(save_button);
v_layout-&addWidget(exit_button);
main_layout-&addWidget(view_finder);
main_layout-&addLayout(v_layout);
connect(capture_button, &QPushButton::clicked, this,
&Dialog::captureImage);
connect(save_button, &QPushButton::clicked, this,
&Dialog::saveImage);
connect(exit_button, &QPushButton::clicked, this,
&Dialog::close);
connect(camera_image_capture,
&QCameraImageCapture::imageCaptured, this,
&Dialog::displayImage);
camera_image_capture-&setCaptureDestination(QCameraImageCapture::CaptureToFile);
camera-&setCaptureMode(QCamera::CaptureStillImage);
camera-&setViewfinder(view_finder);
camera-&start(); //启动摄像头
this-&setLayout(main_layout);
this-&translateLanguage();
Dialog::~Dialog()
void Dialog::translateLanguage()
this-&setWindowTitle("testCapture");
capture_button-&setText(tr("capture"));
save_button-&setText(tr("save"));
exit_button-&setText(tr("exit"));
void Dialog::displayImage(int id, QImage image)
display_label-&setPixmap(QPixmap::fromImage(image));
void Dialog::captureImage()
camera_image_capture-&capture(); &
void Dialog::saveImage()
const QPixmap *pixmap = display_label-&pixmap();
if(pixmap)
pixmap-&save("F:\\a.jpg");
& 技术在于交流、沟通,转载请注明出处并保持作品的完整性。
作者:&&原文:。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。使用opencv2在qt界面上进行摄像头采集以及简单的拍照功能
首先在这边说明一下为什么要写这个,因为在网上都是使用opencv1的代码,个人感觉有点过时,现在大家基本上都是用opencv2或者opencv3,而库基本上都是用opencv2的库。
首先我们要先将环境安装好:
安装opencv,链接地址如下:https://opencv.org/downloads.html安装qt,我个人是安装比较新的qt5.6.0,链接地址如下:http://download.qt.io/archive/配置环境,这个这边不作说明,网上资料一大堆,方法也满天飞,大家自行百度新建工程:
在ui界面上放两个labeltext,以及三个简单的pushbutton
编辑opencam.h文件:
#ifndef OPENCAM_H
#define OPENCAM_H
#include &QWidget&
#include &QImage&
#include &QTimer&
#include &opencv2/highgui/highgui.hpp&
#include &opencv2/core/core.hpp&
#include &imgproc/imgproc.hpp&
using namespace cv;
using namespace std;
namespace Ui {
class opencam;
class opencam : public QWidget
explicit opencam(QWidget *parent = 0);
~opencam();
private slots:
void openCamera();
// 打开摄像头
void readFarme();
// 读取当前帧信息
void closeCamera();
// 关闭摄像头。
void takingPictures();
Ui::opencam *ui;
QImage Mat2QImage(Mat cvImg);
VideoCapture cap;// 视频获取结构, 用来作为视频获取函数的一个参数
Mat frame;//Mat类型,每一帧存放地址
#endif // OPENCAM_H
编辑main.cpp文件
#include "opencam.h"
#include &QApplication&
int main(int argc, char *argv[])
QApplication a(argc, argv);
opencam w;
return a.exec();
编辑opencam.cpp文件
初始化以及进行信号槽链接
= new QTimer(this);
= new QImage();
/*信号和槽*/
connect(timer, SIGNAL(timeout()), this, SLOT(readFarme()));
// 时间到,读取当前摄像头
connect(ui-&open, SIGNAL(clicked()), this, SLOT(openCamera()));
connect(ui-&pic, SIGNAL(clicked()), this, SLOT(takingPictures()));
connect(ui-&closeCam, SIGNAL(clicked()), this, SLOT(closeCamera()));
编辑openCamera()
cap = NULL;
VideoCapture cap(1);
if(!cap.isOpened())
printf("frame is empty\n");
timer-&start(40);
//开始计时,不可缺少,控制帧率,在这里为25帧
编辑readFrame()函数读取摄像头cap&&frame;// 从摄像头中抓取并返回每一帧
// 将抓取到的帧,转换为QImage格式。QImage::Format_RGB888不同的摄像头用不同的格式。
QImage imag = Mat2QImage(frame);
ui-&label-&setPixmap(QPixmap::fromImage(imag));
// 将图片显示到label上
编辑takingPictures()函数进行拍照设置cap&&frame;// 从摄像头中抓取并返回每一帧
imwrite("frame.jpg",frame);
// 将抓取到的帧,转换为QImage格式。QImage::Format_RGB888不同的摄像头用不同的格式。
QImage imag = Mat2QImage(frame);
ui-&label_2-&setPixmap(QPixmap::fromImage(imag));
// 将图片显示到label上
编辑closeCamera()函数timer-&stop();
// 停止读取数据。
cap.release();
到此,所有程序已经准备就绪
资源下载地址:http://download.csdn.net/detail/ryeda/9692129
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!

我要回帖

更多关于 qt调用usb摄像头 的文章

 

随机推荐