Qt 下使用OpenCV

本来安装完OpenCV会有完整的已编译完的直接添加即可。但使用已编译完的会提示问题(我直接使用的时候提示libstdc -6.dll未找到,网上下载后提示版本不对)。所以保险起见还是重新编译过。编译大约需要15分钟(3.2G主频CPU)


一安装

1安装 Qt(QtSdk-offline-win-x86-v1_2_1.exe)(此处安装在C:/QtSDK)

将C:\QtSDK\mingw\bin加入系统环境变量。

2安装OpenCV(OpenCV-2.3.1-win-superpack.exe) 直接设置解压路径(不可有空格?未验证,此处解压在C:/OpenCV)

3安装CMake(cmake-2.8.10-rc2-win32-x86.exe)   勾选加入系统环境变量(不可有空格?此处安装在C:/CMake 2.8正常使用)


二编译

1 打开CMake-Gui

2 设置编译源位置和目标位置(此处源C:/OpenCV/opencv,目标C:/OpenCV/mingw)

3 点击Configure

4提示CUDA_TOOLKIT_ROOT_DIR找不到。指定路径到C:\QtSDK\Desktop\Qt\4.8.1\mingw\bin 后重新Gonfigure

5没有红色显示,点击Generate。没有报错提示Generating done 关闭CMake

6 打开CMD进入刚编译的目录CD C:\OpenCV\mingw

执行mingw32-make命令开始编译(约15分钟)

7 完成后执行mingw32-make install安装(约1分钟)



三配置环境

1 拷贝C:\OpenCV\mingw\build下的bin、include、lib到安装目录(C:\OpenCV)下(OpenCV下的其它文件可删除,只用到这三个文件夹)。

2 将C:\OpenCV\bin加入系统环境变量。


四建立工程

1 在Qt成成的pro文件内加入如下代码

#包含OpenCV文件
INCLUDEPATH += C:\OpenCV\include\opencv \
             C:\OpenCV\include\opencv2 \
             C:\OpenCV\include
LIBS += C:\OpenCV\lib\libopencv_calib3d231.dll.a \
      C:\OpenCV\lib\libopencv_contrib231.dll.a \
      C:\OpenCV\lib\libopencv_core231.dll.a \
      C:\OpenCV\lib\libopencv_features2d231.dll.a \
      C:\OpenCV\lib\libopencv_flann231.dll.a \
      C:\OpenCV\lib\libopencv_gpu231.dll.a \
      C:\OpenCV\lib\libopencv_highgui231.dll.a \
      C:\OpenCV\lib\libopencv_imgproc231.dll.a \
      C:\OpenCV\lib\libopencv_legacy231.dll.a \
      C:\OpenCV\lib\libopencv_ml231.dll.a \
      C:\OpenCV\lib\libopencv_objdetect231.dll.a \
      C:\OpenCV\lib\libopencv_video231.dll.a
 

2 在要使用OpenCV的文件内加入如下包含

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

3 直接使用OpenCV函数。


成功。



参考  http://www.cnblogs.com/liu-jun/archive/2012/09/26/Jacky_Liu.html

http://blog.csdn.net/qiurisuixiang/article/details/8665278


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个使用QtOpenCV进行RTMP推流的例程: 首先,需要确保已经安装了OpenCV和FFmpeg,并且Qt项目中已经添加了OpenCV和FFmpeg的库文件。 然后,需要添加以下头文件: ```cpp #include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/videoio/videoio.hpp> #include <opencv2/videoio/legacy/constants_c.h> #include <QDebug> #include <QThread> #include <QString> #include <QMutex> #include <QDateTime> #include <QStringList> #include <QCoreApplication> ``` 接下来,需要声明一些变量: ```cpp // RTMP 推流地址 const char *rtmpUrl = "rtmp://localhost/live/stream"; // 视频编码器 const char *codecName = "libx264"; // 视频分辨率 const int width = 640; const int height = 480; // 视频帧率 const int fps = 25; // 视频比特率 const int bitrate = 1000000; // 帧计数器 int frameCount = 0; // RTMP 上下文 RTMP *rtmp = NULL; // 视频编码器上下文 AVCodecContext *codecCtx = NULL; // 视频帧 AVFrame *frame = NULL; // 视频帧缓存区 uint8_t *frameBuffer = NULL; // 视频帧缓存区大小 int frameBufferSize = 0; // 视频编码器 AVCodec *codec = NULL; // 编码器参数 AVDictionary *codecParams = NULL; // 编码器帧计数器 int64_t codecFrameCount = 0; // 编码器 PTS 计数器 int64_t codecPtsCount = 0; // 编码器上一帧 PTS int64_t codecLastPts = 0; // 编码器上一帧 DTS int64_t codecLastDts = 0; // 编码器视频流 AVStream *codecStream = NULL; // 编码器视频帧 AVFrame *codecFrame = NULL; // 编码器视频帧缓存区 uint8_t *codecFrameBuffer = NULL; // 编码器视频帧缓存区大小 int codecFrameBufferSize = 0; // 编码器视频帧计数器 int codecFrameCount = 0; // 编码器视频帧时间戳 int64_t codecFramePts = 0; // 编码器视频帧数据大小 int codecFrameDataSize = 0; // 编码器视频帧数据 uint8_t *codecFrameData = NULL; // 编码器视频帧数据指针 uint8_t *codecFrameDataPtr = NULL; // 编码器视频帧数据长度 int codecFrameDataLen = 0; // 编码器视频帧类型 int codecFrameType = 0; // 编码器视频帧是否为关键帧 int codecFrameKeyframe = 0; // 编码器视频帧时间基数 AVRational codecTimeBase = {1, 1000}; // 编码器视频帧时间戳增量 AVRational codecTimeIncrement = {1, fps}; // 编码器视频帧时间戳 AVRational codecPtsTimeBase = {1, AV_TIME_BASE}; ``` 接着,需要定义一个函数用于初始化编码器: ```cpp void initEncoder() { // 初始化编码器 avcodec_register_all(); // 获取编码器 codec = avcodec_find_encoder_by_name(codecName); // 创建编码器上下文 codecCtx = avcodec_alloc_context3(codec); codecCtx->width = width; codecCtx->height = height; codecCtx->bit_rate = bitrate; codecCtx->time_base = codecTimeBase; codecCtx->framerate = codecTimeIncrement; codecCtx->gop_size = fps; codecCtx->pix_fmt = AV_PIX_FMT_YUV420P; codecCtx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; // 设置编码器参数 av_dict_set(&codecParams, "preset", "ultrafast", 0); av_dict_set(&codecParams, "tune", "zerolatency", 0); // 打开编码器 avcodec_open2(codecCtx, codec, &codecParams); // 创建视频帧 codecFrame = av_frame_alloc(); codecFrame->format = codecCtx->pix_fmt; codecFrame->width = codecCtx->width; codecFrame->height = codecCtx->height; codecFrame->pts = 0; av_frame_get_buffer(codecFrame, 0); // 创建视频帧缓存区 codecFrameBufferSize = av_image_get_buffer_size(codecCtx->pix_fmt, codecCtx->width, codecCtx->height, 1); codecFrameBuffer = (uint8_t *)av_malloc(codecFrameBufferSize); av_image_fill_arrays(codecFrame->data, codecFrame->linesize, codecFrameBuffer, codecCtx->pix_fmt, codecCtx->width, codecCtx->height, 1); } ``` 然后,需要定义一个函数用于连接RTMP服务器: ```cpp bool connectRTMP() { // 初始化 RTMP RTMP_Init(rtmp); // 设置 RTMP URL if (!RTMP_SetupURL(rtmp, (char *)rtmpUrl)) { qDebug() << "RTMP_SetupURL error:" << rtmpUrl; return false; } // 设置连接超时时间 rtmp->Link.timeout = 5; // 开始连接 RTMP 服务器 if (!RTMP_Connect(rtmp, NULL)) { qDebug() << "RTMP_Connect error:" << rtmpUrl; return false; } // 开始连接 RTMP 流 if (!RTMP_ConnectStream(rtmp, 0)) { qDebug() << "RTMP_ConnectStream error:" << rtmpUrl; return false; } return true; } ``` 接下来,需要定义一个函数用于初始化视频帧: ```cpp void initFrame() { // 创建视频帧 frame = cvCreateMat(height, width, CV_8UC3); // 创建视频帧缓存区 frameBufferSize = av_image_get_buffer_size(AV_PIX_FMT_YUV420P, width, height, 1); frameBuffer = (uint8_t *)av_malloc(frameBufferSize); } ``` 然后,需要定义一个函数用于发送视频帧: ```cpp bool sendFrame() { // 将视频帧转换为 YUV 格式 cvCvtColor(frame, frame, CV_BGR2YUV_I420); // 将视频帧数据写入编码器缓存区 codecFrame->pts = codecPtsCount; codecFrameDataPtr = codecFrameData; codecFrameDataLen = avcodec_encode_video2(codecCtx, codecFrameDataPtr, codecFrameBufferSize, codecFrame); codecFrameDataPtr += codecFrameDataLen; // 如果编码器缓存区已满,则发送视频帧 if (codecFrameDataLen > 0) { // 计算视频帧时间戳 codecFramePts = av_rescale_q(codecFrameCount, codecTimeIncrement, codecTimeBase); // 发送视频帧 AVPacket pkt; av_init_packet(&pkt); pkt.data = codecFrameData; pkt.size = codecFrameDataLen; pkt.pts = codecFramePts; pkt.dts = codecFramePts; pkt.duration = av_rescale_q(1, codecTimeIncrement, codecTimeBase); pkt.stream_index = codecStream->index; av_interleaved_write_frame(rtmp->opaque, &pkt); av_packet_unref(&pkt); // 更新帧计数器 codecFrameCount++; codecFrameData = NULL; codecFrameDataLen = 0; return true; } return false; } ``` 最后,需要定义一个函数用于发送视频流: ```cpp void sendStream() { while (true) { // 读取视频帧 cv::Mat image; capture >> image; // 如果视频帧为空,则退出 if (image.empty()) { break; } // 将视频帧数据写入视频帧缓存区 memcpy(frameBuffer, image.data, frameBufferSize); // 将视频帧数据写入视频帧 cvSetData(frame, frameBuffer, width * 3); // 发送视频帧 if (sendFrame()) { qDebug() << "sendFrame:" << frameCount << ":" << codecFrameCount << ":" << codecPtsCount; } // 更新帧计数器 frameCount++; codecPtsCount += av_rescale_q(1, codecTimeIncrement, codecTimeBase); } } ``` 最后,在主函数中调用以上函数即可: ```cpp int main(int argc, char *argv[]) { // 初始化 RTMP rtmp = RTMP_Alloc(); if (!rtmp) { qDebug() << "RTMP_Alloc error"; return -1; } // 初始化编码器 initEncoder(); // 初始化视频帧 initFrame(); // 连接 RTMP 服务器 if (!connectRTMP()) { return -1; } // 发送视频流 sendStream(); // 关闭编码器 avcodec_close(codecCtx); // 关闭 RTMP 流 RTMP_Close(rtmp); // 释放 RTMP RTMP_Free(rtmp); // 释放视频帧缓存区 av_free(frameBuffer); // 释放视频帧 cvReleaseMat(&frame); return 0; } ``` 以上就是一个使用QtOpenCV进行RTMP推流的例程。需要注意的是,由于涉及到视频编码和网络传输等技术,代码实现较为复杂,需要仔细理解和调试。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值