基于OpenCV+QT的实时视频传输显示工具(一)

2023-05-16

时常会找一些比较有趣的东西来看,但一般都是看完尝试了事,没怎么做出总结过。现在想想真是可惜,这么多年来,看得东西也不少,但是留下的印记却很少,结果就是找工作时,却拿不出更多的加分项。所以从现在开始,还是做个有心人,慢慢积累,只有自身价值提升了,并且让人看得到,才能获得自己想要的那份报酬。

现在先从OpenCV的使用开始。我始终觉得学习一样东西,单纯学习这个东西是得不到提升的,必须要找到一个立意,构建起一个项目,以项目带动学习,这样理论知识和动手能力都能得到提高。

我的立意就是开发基于OpenCV+QT的实时视频传输显示工具。

基本的思路是实现一个C/S结构。C端实现显示摄像头采集的视频图像,并且在本地利用OpenCV对视频进行处理,并传输视频流。S端接受视频数据,并进行显示。

此过程需要用到的知识如下:

(1)      QT界面

(2)      摄像头视频采集与显示

(3)      OpenCV库使用

(4)      TCP/IP协议

(5)      H264

(6)      多线程编程

(7)      RTMP/RTSP/RTP协议

其中OpneCV、H264以及RTMP/RTSP/RTP对于我来说是两个完全新的东西,需要花点时间学习一下,而其他的基本上温习一下就可以了。

首先需要学习OpenCV的东西。我们可以先用OpenCV实现简单图像的加载和处理,然后再考虑视频的处理。本小节主要先对图形进行加载以及边缘提取,主要代码如下: 

(1)加载图像

voidMainWindow::Loadimage(cv::Mat&mat)

{

    mat=cv::imread("F:\\opencv_test.png");

    if(mat.empty())

    {

        return;

    }

    return;

}

(2)图像格式转换

因为opnencv读取的图片信息为Mat类型的,而QT界面上显示图片时,需要时Qimage类型的,因此还需要将Mat类型图片信息转成Qimage,

 

boolMainWindow::Mat2Qimage(cv::Mat&mat,QImage&qimage)

{

    if(mat.type()==CV_8UC3)

    {

       qimage=QImage((constunsignedchar*)(mat.data),

                        mat.cols,mat.rows,

                        mat.step,

                        QImage::Format_RGB888).rgbSwapped();

       qimage.save("F:\\opencv_test_out.jpg","JPG");

    }

    elseif(mat.type()==CV_8UC1)

    {

       staticQVector<QRgb>  sColorTable;

       //onlycreateourcolortableonce

       if(sColorTable.isEmpty())

       {

           for(inti=0;i<256;++i)

                sColorTable.push_back(qRgb(i,i,i));

       }

       qimage=QImage((constunsignedchar*)(mat.data),

                     mat.cols,mat.rows,

                    mat.step,

                     QImage::Format_Indexed8);

       //Setthecolortable(usedtotranslatecolourindexestoqRgbvalues)

       qimage.setColorTable(sColorTable);

       qimage.save("F:\\opencv_test_out_gray.jpg","JPG");

    }

    else

    {

       returnfalse;

    }

    returntrue;

}

(3)边缘提取

以下是边缘提取的代码,对图像进行边缘处理需要先进行灰度转换,将图像由3通道的彩色图转换为1通道的灰度图,降噪处理后再进行Canny进行边缘检测

voidMainWindow::on_TransButton_clicked()

{

    QImageqimage;

    cv::MatgrayImage,detected_edges;

    cv::cvtColor(cvimage,grayImage,cv::COLOR_BGR2GRAY);

    cv::blur(grayImage,detected_edges,cv::Size(3,3));

    cv::Canny(detected_edges,detected_edges,threshold,3*threshold,3);

    std::cout<<detected_edges.channels()<<std::endl;

    if(!Mat2Qimage(detected_edges,qimage))

    {

       return;

    }

    ui->trans_view_label->setPixmap(QPixmap::fromImage(qimage));

}

 

另外还做了其他转换,将获取的边缘图像作为掩码拷贝到原图上,形成彩色的边缘图,效果如下,具体做法大家可以自己去百度,网上应该有很多这样的用法。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于OpenCV+QT的实时视频传输显示工具(一) 的相关文章

  • JNI中文乱码

    java gt jni gt c 43 43 c 43 43 gt jni gt java 中文显示出现乱码 主要是 Java 和 c 43 43 的编码不一致 xff0c 修改一致即可 修改Java端的看JNI中文乱码 修改c 43 43
  • JNI native函数名称问题

    本地 c 43 43 函数名称是规则是 xff1a Java 包名称 xff08 或类名称 xff09 函数名称 如 xff1a c 43 43 对应的函数名称为 xff1a Java NumberJNICpp average 61 61
  • 如何升级PowerShell

    https www cnblogs com wenBlog p 6198354 html 安装Windows PowerShell 3 0 1 安装Microsoft NET Framework 4 0的完整安装版本 xff08 dotNe
  • 系统添加根证书

    How to add CA to system root Reference KERIOOverview If you want to send or receive messages signed by root authorities
  • C++备忘录092:简单的enum到string的方法?

    godbolt span class token macro property span class token directive keyword include span span class token string lt strin
  • 用递归算法计算鸭子数

    问题描述 xff1a 一个人赶着鸭子去每个村庄卖 xff0c 每经过一个村子卖去所赶鸭子的一半又一只 这样他经过了七个村子后还剩两只鸭子 xff0c 问他出发时共赶多少只鸭子 xff1f 经过每个村子卖出多少只鸭子 xff1f xff08
  • 解决Linux下同时使用有线和无线/4G网络时,网络连接的优先级问题

    1 查看当前网关信息 ip route show 显示如下 xff1a 可以看到前两行default开头的就是默认网关 192 168 1 1是我的有线网关 xff0c 172 28 0 1是wifi网关 原来是有线网关的优先级更高导致的问
  • iOS UITableViewCell 高度自适应的解决方案

    span class token comment 设置预加载cell高度 span tableView span class token punctuation span estimatedRowHeight span class toke
  • Swift REPL

    swift 打开终端 xff0c 输入swift xff0c 启动swift swift Welcome to Apple Swift version 5 2 4 swiftlang 1103 0 32 9 clang 1103 0 32
  • xmpp 注册Registration

    在客户端上开发xmpp的注册功能 xff0c 即带内注册 带内注册指的是未在服务器上开通账号的用户可以通过xmpp协议注册新账号 相反的概念是带外注册 xff08 out of band registration xff09 xff0c 例
  • 六招让你的Ubuntu马上提速

    Ubuntu的启动速度非常快 xff0c 按了开机键之后很快就进入桌面 但我们仍然可以充分利用内存 xff0c 通过多种方法让开机速度更快 某些方法真的可以提速 xff0c 对于旧电脑的效果尤其明显 选用轻量级的桌面环境 xff0c 关闭不
  • 缺少libtinfo.so.5解决办法

    svn error svn This client is too old to work with working copy 39 39 You need to get a newer Subversion client or to dow
  • UITableViewCell动态高度设置

    UITableViewCell的高度在默认状态下能表现的的东西很少 xff0c 而且在复用的时候由于需要展示的信息不一定 xff0c 所以需要动态的调节Cell的高度来满足我们对不同内容的展示 在IOS8之前 xff0c 这需要手动进行计算
  • iOS: CGContext的函数CGContextAddQuadCurveToPoint

    void CGContextAddQuadCurveToPoint CGContextRef c CGFloat cpx CGFloat cpy CGFloat x CGFloat y
  • 怎样在android各级打印backtrace

    如何在android各层打印backtrace http janbarry0914 blogspot hk 2014 07 androiddump call stack html C 43 43 中 xff1a include lt uti
  • HOG特征(Histogram of Gradient)学习总结

    最近在做的项目有用到HOG 43 SVM这一方面的知识 xff0c 参考相关论文和网上一些博文在此对HOG特征进行下总结 参考资料 xff1a HOG的经典论文 xff1a Dalal N Triggs B Histograms of or
  • 递归-角谷定理

    问题描述 xff1a 角谷定理 输入一个自然数 xff0c 若为偶数 xff0c 则把它除以2 xff0c 若为奇数 xff0c 则把它乘以3加1 经过如此有限次运算后 xff0c 总可以得到自然数值1 求经过多少次可得到自然数1 如 xf
  • iOS之自定义导航按钮UIBarButtonItem的样式

    在一个APP中导航的重要性和方便性自然不需要多说了 xff0c 由于系统的导航用起来实在不怎么友好 xff0c 一直想抽个时间把导航学习下 由于投入到工作的时间多些 xff0c 懒懒散散的一直都是用的时候才去找度娘 xff0c 一直没来个总
  • IOS学习之一个示例弄懂代理(delegate)和协议

    转自http blog csdn net pony maggie article details 25655443 代理和协议的语法这里不赘述 xff0c 自己查资料 这个demo的思路是这样的 xff0c 有一个A类 xff0c 这个类不
  • ios中使用 NSJSONSerialization对 json数据的解析

    ios5中apple增加了解析JSON的api NSJSONSerialization 通过该类 xff0c 我们可以完成JSON数据与 NSDictionary 和 NSArray 之间的转化 网上已经有人做过测试 xff0c NSJSO

随机推荐

  • 【Xcode】undefined symbols错误总结

    http blog csdn net nextstudio article details 8919241 今天在使用ZBar的时候 xff0c 报了很多undefined symbols错误 特意总结一下这类错误 1 framework缺
  • GitHub第三方资源库整理(OC篇)

    http www jianshu com p a1c3b7d5bab1 随着GitHub star 的项目越来越多 xff0c 而且之前也没有整理 xff0c 所以找起来特别麻烦 xff0c 于是就有了这篇文章 xff0c 一是方便我自己查
  • 整理的一些swift开源项目,仅供学习交流!!

    1 swift3 0开发的自学英语社区app 2 https github com netyouli 3 六阿哥的开源项目 xff0c 均已上架 新版剑三壁纸库app xff0c 使用swift开发 使用swift语言写的一款新闻资讯类的a
  • 令世人惊叹的服务器端 Swift!

    转自 xff1a http www code4app com blog 822721 634 html 时至今日 xff0c Swift 已然演变成了一门开源 跨平台的编程语言 xff0c 有许多个团队正在竞相利用 Swift 语言能够用于
  • 33 个 2017 年必须了解的 iOS 开源库

    http www cocoachina com ios 20170208 18647 html 本文翻译自Medium xff0c 原作者为Pawe Bia ecki 照片版权 xff1a xff08 Unsplash Markus Pe
  • 整理的一些iOS 开源框架

    1 一个拥有多种优雅风格的搜索控制器 https github com iphone5solo PYSearch
  • Windows端通过Vscode或PowerShell连接linux服务器,打开图形界面的程序

    问题 Windows主机不进行任何配置ssh连接到linux服务器上 xff0c 打开图形界面软件 xff0c 会出现下面的错误 xff1a gedit 46927 Gtk WARNING cannot open display 解决Win
  • 循环依赖问题终极解决方案

    今天下午给师兄抽云图数据的时候 xff0c 报错了 说到底还是C 43 43 太菜了 xff0c 调试了一会才发现是写了个循环依赖 xff0c 这四个字是这篇文章的重点 这个不是头文件重复包含的问题 xff0c 看下面的图可能一下就明白了菜
  • Linux ln命令、软链接和硬链接的区别

    前些天发现了一个巨牛的人工智能学习网站 xff0c 通俗易懂 xff0c 风趣幽默 xff0c 忍不住分享一下给大家 点击跳转到教程 Linux ln命令是一个非常重要命令 xff0c 它的功能是为某一个文件在另外一个位置建立一个同步的链接
  • mysql 查找配置文件 my.ini 位置方法

    前些天发现了一个巨牛的人工智能学习网站 xff0c 通俗易懂 xff0c 风趣幽默 xff0c 忍不住分享一下给大家 点击跳转到教程 个人备注 xff1a 不显示文件类型时 xff0c my ini 文件名就叫作 my xff0c 文件属性
  • VS2019 + CUDA10.1 安装和配置

    VS2019 43 CUDA10 1 安装和配置 1 CUDA 10 1 安装 1 cuda官方下载网址 xff0c 找到cuda版本为cuda10 1 xff0c 选择自己系统对应的版本下载安装程序 2 运行cuda 10 1 243 4
  • pip使用清华镜像下载

    pip使用清华镜像下载 在国内使用pip安装python第三方包时 xff0c 可能会出现下载速度较慢的情况 xff0c 这时可以尝试从国内的pip镜像源下载这些包 xff0c 大大加快下载速度 xff1a 我们常用清华源 xff0c 在p
  • windows10安装Ubuntu20.04及界面图形化

    这里写自定义目录标题 windows10安装Ubuntu20 04及界面图形化一 安装前windows的配置二 ubuntu20 04系统安装三 ubuntu 20 04更换清华大学源四 中文汉化五 安装图形界面 xff0c VcXsrv的
  • opencv 获取rtsp原始码流代码

    opencv不仅可以获取解码后的图片数据 xff0c 还可以获取未经解码的原始码流数据 这样为使用其他硬解码器提供方便 在编译opencv cmake时需要指定 D WITH FFMPEG 61 ON python 代码如下 xff0c 需
  • 通过Launchpad查找PPA仓库

    我们通常会通过查找安装命令得知一些仓库名 xff0c 我们还可以通过Ubuntu Launchpad网站查询更多信息 首先登录https launchpad net 然后搜索自己关心的ppa xff0c 例如我们搜索得到了ppa jonat
  • ffmpeg 中 rtsp相关源码解析(五)

    lt lt ffmpeg 中 rtsp相关源码解析 四 gt gt 简单介绍了rtp包是通过ff rtsp fetch packet来获取的 我们更深入地问一个问题 xff0c 那么对于vp8 h264等音视频编解码标准 xff0c 这些p
  • 庆祝博客访问量即将突破20万

    2018年开始更新博客 xff0c 到现在已有3年 博客访问量预计这周就突破20万 本来写这博客并没有特别的目的 xff0c 只是想记录在工作学习过程中遇到的问题 也没想到会有这么多的访问 从南京到无锡再到上海 xff0c 一次次突破 从0
  • ffmpeg 源码分析 解码流程

    以ffmpeg 3 4 中的ffplay 来举例 全局初始化 av register all avformat network init AVFORMAT 设置过程 avformat alloc context avformat open
  • post传数组

    业务中涉及批量删除 xff0c 就需要传多个id xff0c 用数组吧 在post中 xff0c 参数都是键值对的形式 xff0c 键和值都是string类型 xff0c 那么就需要把数组序列化为string的形式 Array toStri
  • 基于OpenCV+QT的实时视频传输显示工具(一)

    时常会找一些比较有趣的东西来看 xff0c 但一般都是看完尝试了事 xff0c 没怎么做出总结过 现在想想真是可惜 xff0c 这么多年来 xff0c 看得东西也不少 xff0c 但是留下的印记却很少 xff0c 结果就是找工作时 xff0