layout: post
title: QTmsvc2015+opencv249 初次环境搭建以及遇到的问题
comments: true
tags:
- QT、opencv、c++
学习笔记----------------------------qt
1)安装opencv记住自己的路径 ,默认安装就好,配置环境变量一般都会,环境变量的目的就是(我的理解)让软件去到相应的位置寻找dll文件,如果你不配置环境变量也可以,那就把程序所需要的文件都放到build 相应的文件里面,这样当你删除debug文件时还需要在复制一便,所以还是配置环境变量比较稳妥。
]((程序异常结束。))**
另外会出现这种问题,这种问题多半使环境变量没有配置好,解决办法我的是打开相应的构建文件夹
找到构建的.exe文件。双击此时会提示你缺什么文件,此时在everything里去搜这个文件找到相应的文件位置,可能会有好多,此时你需要去分析一下,哪个是系统里的文件,一般设置系统的环境变量比较通用,我遇到了丢失msvcp120d的文件,我上传到资源了,可以去下载,这样把所有的文件补好,环境变量搭建好,这个问题基本解决了,
2)配置qt
我之前装的是5.9.0这个软件似乎是有个bug我弄了好久,始终没有解决,最后换成5.9.4版本,bug就是在5.9.0执行添加库文件没有响应.
下面开始配置
选择”添加库“
在这里一点更要看仔细了,不能是选完了就默认了,之后会在pro文件里生成一段代码。
主要是这两部分然而还不够,要把相应的文件补全
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上显示
2.初试牛刀---打开相机,在qt labe上显示
ui界面----在这里注意只起用了相机1和2,
| QToolButton| Button_close |
|-QToolButton-|-Button_close-|
|QToolButton | Button_close|
|QLable|camera_1 |
|-QLable-|-camera_2-|
下面是。h文件的代码
#ifndef GOALWIDGET_H
#define GOALWIDGET_H
#include <opencv/cv.h>
#include <QWidget>
#include <opencv/highgui.h>
#include <opencv/cv.h>
#include <QImage>
#include <QTimer> // 设置采集数据的间隔时间
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 <QPainter>
#include <QPixmap>
#include <opencv/highgui.h>
#include <opencv/cv.h>
#include <QImage>
#include <QTimer>
#include <QDebug>
#include <mainwindow.h>
#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不可见人哈哈、、、、、、