qt(msvc2015)+opencv 打开摄像头


layout: post
title: QTmsvc2015+opencv249 初次环境搭建以及遇到的问题
comments: true
tags:
- QT、opencv、c++


学习笔记----------------------------qt


1环境搭建

    • ui界面----在这里注意只起用了相机1和2, ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201114191831240.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzIzMzE4OQ==,size_16,color_FFFFFF,t_70#pic_center) | QToolButton| Button_close | |-QToolButton-|-Button_close-| |QToolButton | Button_close|

1)安装opencv记住自己的路径 ,默认安装就好,配置环境变量一般都会,环境变量的目的就是(我的理解)让软件去到相应的位置寻找dll文件,如果你不配置环境变量也可以,那就把程序所需要的文件都放到build 相应的文件里面,这样当你删除debug文件时还需要在复制一便,所以还是配置环境变量比较稳妥。

]((程序异常结束。))**在这里插入图片描述
另外会出现这种问题,这种问题多半使环境变量没有配置好,解决办法我的是打开相应的构建文件夹
qt(msvc2015)+opencv 打开摄像头_第1张图片
找到构建的.exe文件。双击此时会提示你缺什么文件,此时在everything里去搜这个文件找到相应的文件位置,可能会有好多,此时你需要去分析一下,哪个是系统里的文件,一般设置系统的环境变量比较通用,我遇到了丢失msvcp120d的文件,我上传到资源了,可以去下载,这样把所有的文件补好,环境变量搭建好,这个问题基本解决了,
2)配置qt
我之前装的是5.9.0这个软件似乎是有个bug我弄了好久,始终没有解决,最后换成5.9.4版本,bug就是在5.9.0执行添加库文件没有响应.
下面开始配置
qt(msvc2015)+opencv 打开摄像头_第2张图片
选择”添加库“
qt(msvc2015)+opencv 打开摄像头_第3张图片
qt(msvc2015)+opencv 打开摄像头_第4张图片

在这里一点更要看仔细了,不能是选完了就默认了,之后会在pro文件里生成一段代码。qt(msvc2015)+opencv 打开摄像头_第5张图片
主要是这两部分然而还不够,要把相应的文件补全
qt(msvc2015)+opencv 打开摄像头_第6张图片

win32:CONFIG(release, debug|release): LIBS += -LD:/software/opencv/build/x64/vc12/lib/
 -lopencv_calib3d249\
-lopencv_core249 \
-lopencv_imgproc249 \
-lopencv_highgui249 \
-lopencv_ml249 \
-lopencv_video249 \
-lopencv_features2d249 \
-lopencv_calib3d249 \
-lopencv_objdetect249 \
-lopencv_contrib249 \
-lopencv_legacy249 \
-lopencv_flann249

else:win32:CONFIG(debug, debug|release): LIBS += -LD:/software/opencv/build/x64/vc12/lib/
 -lopencv_calib3d249d\
-lopencv_core249d \
-lopencv_imgproc249d \
-lopencv_highgui249d \
-lopencv_ml249d \
-lopencv_video249d \
-lopencv_features2d249d \
-lopencv_calib3d249d \
-lopencv_objdetect249d \
-lopencv_contrib249d \
-lopencv_legacy249d \
-lopencv_flann249d

在这里可以举一反三了,包含的路径可以自己增加其他的库,比如avt的或者巴斯勒的驱动库,
加完这些执行qmake

2.初试牛刀---打开相机,在qt labe上显示

    • ui界面----在这里注意只起用了相机1和2, ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201114191831240.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzIzMzE4OQ==,size_16,color_FFFFFF,t_70#pic_center) | QToolButton| Button_close | |-QToolButton-|-Button_close-| |QToolButton | Button_close|

2.初试牛刀---打开相机,在qt labe上显示

    • ui界面----在这里注意只起用了相机1和2, ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201114191831240.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzIzMzE4OQ==,size_16,color_FFFFFF,t_70#pic_center) | QToolButton| Button_close | |-QToolButton-|-Button_close-| |QToolButton | Button_close|

ui界面----在这里注意只起用了相机1和2,
qt(msvc2015)+opencv 打开摄像头_第7张图片
| QToolButton| Button_close |
|-QToolButton-|-Button_close-|
|QToolButton | Button_close|

|QLable|camera_1 |
|-QLable-|-camera_2-|

下面是。h文件的代码

#ifndef GOALWIDGET_H
#define GOALWIDGET_H
#include 
#include 
#include 
#include 
#include 
#include    // 设置采集数据的间隔时间
namespace Ui {
class goalwidget;
}

class goalwidget : public QWidget
{
    Q_OBJECT

public:
    explicit goalwidget(QWidget *parent = 0);
    ~goalwidget();
    void openCamara();      // 打开摄像头

    void closeCamara();     // 关闭摄像头。
    void takingPictures();  // 拍照
private slots:

    void readFarme();       // 读取当前帧信息

    void on_Button_open_clicked();

    void on_Button_close_clicked();

    void on_Button_photo_clicked();

    void on_toolButton_clicked();

public:
    Ui::goalwidget *ui;
    QTimer    *timer;
    QImage    *imag;
    CvCapture *cam;// 视频获取结构, 用来作为视频获取函数的一个参数
    IplImage  *frame;//申请IplImage类型指针,申请内存空间来存放图像

};

#endif // GOALWIDGET_H



这里就要注意opencv的适用版本问题了我用过440的版本,那个版本没有cv.h,也就会造成cvCreateCameraCapture(0);没有标识符的问题,所以也并不是版本越高越好,我为了顺应项目暂时用249进行后续开发,但也会慢慢研究高版本,毕竟高版本的只有一个world{{{
下面是.c文件

#include "goalwidget.h"
#include "ui_goalwidget.h"
#include 
#include 
#include 
#include 
#include 
#include   
#include 
#include 
#pragma execution_character_set("utf-8")//这句话解决了程序运行之后会显示中文乱码问题
#define cout qDebug() << "[ "<<__FILE__<<" : "<<__LINE__<<" ]"//来实现习惯的cout输出打印调试内容

#define camerawidth 300//图像尺寸
#define cameraheight 300

using namespace cv;//opencv命名空间
goalwidget::goalwidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::goalwidget)
{
    ui->setupUi(this);
    cam     = NULL;
    timer   = new QTimer(this);
    imag    = new QImage();         // 初始化
    connect(timer,&QTimer::timeout,this,&goalwidget::readFarme);// 时间到,读取当前摄像头信息一个信号曹链接机制

}
goalwidget::~goalwidget()
{

    goalwidget::closeCamara();
    delete ui;
    cout << "释放资源,必须释放";//yangc养成一个释放资源好习惯
}
/******************************
********* 打开摄像头 ***********
*******************************/
void goalwidget::openCamara()
{
   cam = cvCreateCameraCapture(0);//打开摄像头,从摄像头中获取视频
   timer->start(33);        // 开始计时,超时则发出timeout()信号

   cout << "打开摄像头";

}

/*********************************
********* 读取摄像头信息 ***********
**********************************/
void goalwidget::readFarme()
{
//       videocapture->read(matFrame);
//       QImage imgg = cvMat2QImage(matFrame);
//       QPixmap qpixmap = QPixmap::fromImage(imgg);

//       // 将图片显示到label上
//       clickLabel->setPixmap(qpixmap);
    frame = cvQueryFrame(cam);  // 从摄像头中抓取并返回每一帧
    // 将抓取到的帧,转换为QImage格式。QImage::Format_RGB888不同的摄像头用不同的格式。
    QImage image = QImage((const uchar *)frame->imageData,
                          camerawidth,
                          cameraheight,
                          QImage::Format_Alpha8).rgbSwapped();
    //因为 frame 取出来的是镜像图片,水平方向上是左右颠倒的,
    //所以使用 mirrored 将 水平方向的图片 再次镜像回来,显示就正确了
    ui->camera_1->setPixmap(QPixmap::fromImage(image.mirrored(true,false)));
    cout << "读取摄像头信息";
}


/*************************
********* 拍照 ***********
**************************/
void goalwidget::takingPictures()
{
    frame = cvQueryFrame(cam);  // 从摄像头中抓取并返回每一帧
    // 将抓取到的帧,转换为QImage格式。QImage::Format_RGB888不同的摄像头用不同的格式。
    QImage image = QImage((const uchar *)frame->imageData,
                          camerawidth,
                          cameraheight,
                          QImage::Format_RGB888).rgbSwapped();
    ui->camera_2->setPixmap(QPixmap::fromImage(image.mirrored(true,false)));
    cout << "拍照";
}

/*******************************
***关闭摄像头,释放资源************
********************************/
void goalwidget::closeCamara()
{
    timer->stop();          // 停止读取数据。
    cvReleaseCapture(&cam);//释放内存;

    cout << "关闭摄像头,释放资源";
}



void goalwidget::on_Button_open_clicked()
{
   openCamara();
}

void goalwidget::on_Button_close_clicked()
{
    closeCamara();
}

void goalwidget::on_Button_photo_clicked()
{
    takingPictures();
}

void goalwidget::on_toolButton_clicked()
{
    MainWindow *w=new MainWindow();
    w->showMaximized();

    this->close();
    goalwidget::~goalwidget();
}


运行结果不方便展示,ui不可见人哈哈、、、、、、

你可能感兴趣的:(qt,opencv,c++,opencv,qt)