Qt+OpenCV运行时可以编译通过,但总是出程序异常结束。解决方案!

本文介绍了一种解决Qt与OpenCV集成时遇到的运行时崩溃问题的方法,包括环境变量配置、.pro文件调整及清理编译文件等步骤。

本人的运行环境为:

操作系统:Windows7

运行:QtCreator(Qt5.7) + OpenCV(2.4.9)

背景:之前在另一台电脑运行的是Qt4.7 + OpenCV2.4.2,(.pro)文件配置如下:

<span style="white-space:pre">	</span>INCLUDEPATH += C:\Opt\opencv\build\include
	INCLUDEPATH += C:\Opt\opencv\build\include\opencv
	INCLUDEPATH += C:\Opt\opencv\build\include\opencv2

	LIBS+=      C:\Opt\opencv\build\x86\vc10\lib\opencv_ml242d.lib\
            C:\Opt\opencv\build\x86\vc10\lib\opencv_calib3d242d.lib\
            C:\Opt\opencv\build\x86\vc10\lib\opencv_contrib242d.lib\
            C:\Opt\opencv\build\x86\vc10\lib\opencv_core242d.lib\
            C:\Opt\opencv\build\x86\vc10\lib\opencv_features2d242d.lib\
            C:\Opt\opencv\build\x86\vc10\lib\opencv_flann242d.lib\
            C:\Opt\opencv\build\x86\vc10\lib\opencv_gpu242d.lib\
            C:\Opt\opencv\build\x86\vc10\lib\opencv_highgui242d.lib\
            C:\Opt\opencv\build\x86\vc10\lib\opencv_imgproc242d.lib\
            C:\Opt\opencv\build\x86\vc10\lib\opencv_legacy242d.lib\
            C:\Opt\opencv\build\x86\vc10\lib\opencv_objdetect242d.lib\
            C:\Opt\opencv\build\x86\vc10\lib\opencv_video242d.lib\
            C:\Opt\opencv\build\x86\vc10\lib\opencv_videostab242d.lib
main.c文件运行一个简单的opencv代码。

#include "mainwindow.h"
#include <QApplication>

#include "cv.h"
#include "cxcore.h"
#include "highgui.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

        //声明IplImage指针
        IplImage *pImg;
        //载入图片
        pImg=cvLoadImage("F:\\1.png",1);
        //创建窗口
        cvNamedWindow("Image",1);
        //显示图像
        cvShowImage("Image",pImg);
        //等待按键
        cvWaitKey(0);
        //销毁窗口
        cvDestroyWindow("Image");
        //释放图像
        cvReleaseImage(&pImg);

    return a.exec();
}
编译通过,程序可以正常运行。

今天,在新电脑配置好Qt5.7+opencv249后,在main.c贴的也是以上的

代码,(.pro)文件配置也一样只不过将242改为了249。然后在编译,可以通过

但是运行不了,一运行就出现以下错误信息。

Starting D:\Projects\PROS_Qt\build-TestQt5_7-Desktop_Qt_5_7_0_MinGW_32bit-Debug\debug\TestQt5_7.exe...

程序异常结束。

D:\Projects\PROS_Qt\build-TestQt5_7-Desktop_Qt_5_7_0_MinGW_32bit-Debug\debug\TestQt5_7.exe crashed.

于是网上找了类似问题,但是一般都是提问的,解决的倒是没找到,都是

零零散散的讨论,我在大家的讨论中总结了以下的解决方案。

  1)配置Qt的mingw环境变量,在系统环境变量Path后面添加以下几个路径

C:\Opt\qt5.7.0\5.7\mingw53_32\bin

C:\Opt\qt5.7.0\Tools\mingw530_32\bin

C:\Opt\qt5.7.0\Tools\mingw530_32\i686-w64-mingw32\bin

注:如果opencv的环境变量没配置,一行配置(配置自行度娘)。

  2)修改(.pro)文件的LIBS(加上-L -l ),修改如下,自行与以上.pro对比(红色

INCLUDEPATH+=       C:\Opt\opencv\build\include\opencv\
                    C:\Opt\opencv\build\include\opencv2\
                    C:\Opt\opencv\build\include

<span style="color:#ff6666;">LIBS += -L"C:Opt\\opencv\\build\\x86\\vc10\\lib" \
        -lopencv_core249 \
        -lopencv_highgui249 \
        -lopencv_imgproc249 \
        -lopencv_ml249d \
        -lopencv_video249d\
        -lopencv_features2d249d\
        -lopencv_calib3d249d\
        -lopencv_objdetect249d\
        -lopencv_contrib249d\
        -lopencv_legacy249d\
        -lopencv_flann249d</span>
现在,再次编译运行,不出意外应该可以了,如果不行,执行下一步。

3)删除之前编译的(debug or release)文件夹下的exe文件,然后再次

编译运行,这次绝对是OK的。

本人就是这样搞定了。



### 使用 QtOpenCV 实现 RTSP 流的读取与显示 要通过 QtOpenCV 来实现 RTSP 流的读取与显示,可以按照以下方法完成: #### 1. 编译并配置 OpenCV 支持 FFmpeg 为了能够成功读取 RTSP 流数据,需要确保在编译 OpenCV候启用了 `FFMPEG` 功能。这可以通过 CMake 构建工具来实现,具体参数如下: ```bash cmake -D WITH_FFMPEG=ON .. ``` 此选项会在 OpenCV 中集成 FFmpeg 库的支持,从而允许其解析复杂的音视频流协议[^1]。 #### 2. 创建 Qt 工程并初始化界面 创建一个新的 Qt Widgets Application 并设计窗口布局。假设我们有一个 QLabel 控件用于显示视频帧,则可以在构造函数中进行必要的初始化工作。 以下是 MainWin 类的部分代码片段展示如何加载 RTSP 地址以及获取 FPS 参数: ```cpp #include "ui_MainWin.h" #include <QTimer> #include <QDebug> MainWin::MainWin(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWin) { ui->setupUi(this); // 初始化 VideoCapture 对象 this->video = cv::VideoCapture("rtsp://admin:mima@192.168.5.65:554/h264/ch1/sub/av_stream"); if (!this->video.isOpened()) { qCritical() << "Failed to open the RTSP stream!"; return; } // 获取帧率 double rate = this->video.get(cv::CAP_PROP_FPS); qDebug() << "Frame Rate:" << rate; QTimer* timer = new QTimer(this); connect(timer, SIGNAL(timeout()), SLOT(update_frame())); timer->start(1000 / rate); // 设置定器间隔间等于帧周期 } ``` 上述代码实现了以下几个功能点: - 调用 `cv::VideoCapture()` 方法传入 RTSP URL 进行连接测试。 - 如果未能正常开启资源则打印错误日志退程序运行逻辑。 - 利用 `get(CAP_PROP_FPS)` 函数提取当前输入源的实际刷新频率作为后续更新画面的间依据[^2]。 #### 3. 定义槽函数以持续抓取图像帧 定义一个名为 `update_frame` 的私有成员函数用来定期捕获最新的一帧图片并通过 QImage 显示来: ```cpp void MainWin::update_frame() { cv::Mat frame; bool ret = this->video.read(frame); if (ret && !frame.empty()) { cv::cvtColor(frame, frame, CV_BGR2RGB); QImage img((const uchar*)frame.data, frame.cols, frame.rows, static_cast<int>(frame.step), QImage::Format_RGB888); QPixmap pixmap = QPixmap::fromImage(img.scaled(ui->label->size(), Qt::KeepAspectRatio)); ui->label->setPixmap(pixmap); } else { qWarning() << "No more frames or invalid capture."; } } ``` 这里需要注意的是由于默认情况下 OpenCV 处理的颜色空间为 BGR ,而 Qt 所使用的则是 RGB 模型所以必须先调用 `cv::cvtColor()` 将色彩通道顺序转换过来再交给 QImage 去渲染^。 另外考虑到实际应用场景下可能会遇到短暂性的网络波动造成丢包现象进而影响到整个系统的稳定性因此有必要加入异常恢复机制即当检测到失败状态尝试重新建立链接直到恢复正常为止[^3]: ```cpp if(!ret || frame.empty()){ while(!(this->video.open("rtsp://..."))){ std::this_thread::sleep_for(std::chrono::milliseconds(100)); } } ``` 以上就是完整的基于 QtOpenCV 的 RTSP 视频流播放解决方案概述。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值