在Linux操作系统上,编写带界面的图像处理程序,选择opencv+QT是一种很好的选择。GoQTtemplate3是我为编写Linux下图像处理程序实现的框架,希望能够为大家解决Linux环境下桌面图像处理程序,提供一些帮助。

文中相关代码请参考:https://github.com/jsxyhelu/GOQTtemplate3
一、基本环境构建
a、我们需要完整地安装QT。具体方法,是从网站上下载在线安装程序,并且直接安装

b、下载并且安装OpenCV

直接使用编译好的OpenCV类库

sudo apt-get install libcv-dev
sudo apt-get install libopencv-dev

全部成功后在QT中进行相关配置:

安装完成之后,opencv相关的头文件被安装到/usr/include目录中,该目录是linux默认头文件查找路径。

修改配置文件:

编写相关代码

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <QFileDialog>
using namespace cv;
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow){ ui->setupUi(this);}
MainWindow::~MainWindow(){ delete ui;}
void MainWindow::on_pushButton_clicked()
{
    //第3个参数表示查找文件时从哪个目录开始,如果为"."的话,表示从该工程目录开始查找,最后那个参数的过滤器的名字之间
    //要用空格,否则识别不出来
    QString img_name = QFileDialog::getOpenFileName( this, tr("Open Image"), ".",tr("Image Files(*.png *.jpg *.jpeg *.bmp)"));
    //toAscii()返回8位描述的string,为QByteArray,data()表示返回QByteArray的指针,QByteArray为字节指针
    //现在已改为toLatinl函数
    Mat src = imread( img_name.toLatin1().data());
    cvtColor( src, src, CV_BGR2RGB );
    QImage img = QImage( (const unsigned char*)(src.data), src.cols, src.rows, QImage::Format_RGB888 );
    ui->label->setPixmap( QPixmap::fromImage(img) );
    img_name.clear();
}
实现以下效果:
注意,所有操作的目录都不要放在中文目录下面。能够正常显示出Lena,那么证明QT和OpenCV的环境都是配置正确了。
二、QT自己带的例子程序是重要参考

这段代码主要是基于QCamera实现了摄像头的抽象,由于是官方代码,实现过程中采用了较多的“信号、槽”的机制,还是很值的参考的。但是就图像处理这块而言,价值一般。

三、《qt5.9c++开发指南》例程序解析

这个程序最为重要的地方,就是实现了摄像头设备的枚举(当然QT官方的例子可能也实现了,但是不是非常明显);在图像采集这块,同样采用的是QCamera。这段代码还有一个特点,就是实现了一个较为完善的界面模型。


//  创建  QCamera对象
    QCameraInfo curCameraInfo=QCameraInfo::defaultCamera(); //获取缺省摄像头
    ui->comboCamera->addItem(curCameraInfo.description());//摄像头描述
    ui->comboCamera->setCurrentIndex(0);

但是这段程序存在一个问题,就是只选择默认摄像头,实际上,我们需要获得的是所有摄像头,那么就必须对这段代码进行相关修改:
  const QList<QCameraInfo> availableCameras = QCameraInfo::availableCameras();
    for (const QCameraInfo &cameraInfo : availableCameras) {
          ui->comboCamera->addItem(cameraInfo.description());//摄像头描述
    }
    ui->comboCamera->setCurrentIndex(0);


这样将非常方便后面的操作。
四、结合OpenCV功能,编写GoQTtemplate3

我们最终还是需要将OpenCV引入其中,因为这样才能够更方便我们进行图像处理操作。之前介

绍过的GoQTtemplate2就是实现了相关的功能。

需要说明的地方是,为了将摄像头选择功能加入目前平台,需要添加QCameraInfo.h,这个前提

是在.pro文件中,添加

multimedia类库。
并且将初始化程序加入其中

同时,我们在打开摄像头的时候,也要根据选择来进行打开。
同时需要添加错误控制,每次打开摄像头之前关闭之前的摄像头。具体内容可以参考代码。
五、备注

a、在程序的配置过程中,非常容易出现错误的一个问题为::

/usr/bin/ld: cannot find -lxxx 这种情况是系统找不到对应的库文件,其中,-lxxx表示链接库文件 libxxx.so。
具体的解决方法是先用locat找到指定的lib文件,查看链接文件是否正确的指向了我们希望的lib,如果不是,用
 ln -sf */libxxx.so.x */libxxx.so 指令修改它。
连接以后,输入ldconfig来让动态链接库供系统共享。
比如

b、如果出现视频窗口是黑屏的,怎么回事?
在Vmware Workstation的“虚拟机”->“虚拟机设置”->“USB控制器”下,查看“USB兼容性”,如果当前是“USB2.0”就修改为“USB3.0”,反之就修改为“USB2.0”。然后再在“虚拟机”->“可移动设备”下重新连接Camera,最好重新启动下即可。

感谢阅读至此,希望有所帮助。

基于opencv和QT的摄像头采集代码( GoQTtemplate3持续更新)的更多相关文章

  1. 基于opencv和mfc的摄像头采集代码(GOMFCTemplate2)持续更新

            编写带界面的图像处理程序,选择opencv+mfc是一种很好的选择:在读取摄像头数据方面,网上的方法很多,其中shiqiyu的camerads的方法是较好的.       基于现有资料 ...

  2. 基于opencv和mfc的摄像头采集代码(GOMFCTemplate2)

            编写带界面的图像处理程序,选择opencv+mfc是一种很好的选择:在读取摄像头数据方面,网上的方法很多,其中shiqiyu的camerads的方法是较好的.       基于现有资料 ...

  3. (GO_GTD_2)基于OpenCV和QT,建立Android图像处理程序

    一.综述     如何采集图片?在windows环境下,我们可以使用dshow,在linux下,也有ffmpeg等基础类库,再不济,opencv自带的videocapture也是提供了基础的支撑.那么 ...

  4. 基于opencv和qt的人脸检测小系统

    摘要:利用opencv读取视频.图片并检测人脸,利用QT显示窗口,功能选择等 环境:Ubuntu18.04.OpenCV3.4.0.QT5.10.1 效果图: 代码如下(比较简单没什么注释): mai ...

  5. (GO_GTD_1)基于OpenCV和QT,建立Android图像处理程序

    一.创建新QT工程 一定要是全英文路径,比如"E:\android_qt_opencv\GO_GTD" 由于我们在安装的时候,选择android的工具链,所以在这里会出现以下选择, ...

  6. (GO_GTD_3)基于OpenCV和QT,建立Android图像处理程序

    一.解决权限问题     图片采集了,处理了,如何保存?最直接的方法是使用imwrite,但是如果现在直接使用的话,比如会出现这样或那样的错误,因为我们现在是在android的环境下进行图像处理,所以 ...

  7. 【从0開始Tornado建站】0.9版本号python站点代码开源--持续更新中

            从5月份開始[从0開始Tornado建站]这个专栏,開始一点一点把这个分类兴趣站点弄起来,从无到有的过程也是令人兴奋的:-) 国庆的时候等待备案然后上线,如今站点域名为ustchack ...

  8. Phantomjs实用代码段(持续更新中……)

    一.下载 下载链接二.解压安装包 直接解压即可三.配置环境变量 找到高级系统设置,打开它,出现以下图.点击环境变量. 分别点击编辑按钮 分别新建添加当初的解压路径,到bin文件夹.点击确定. 这样,环 ...

  9. 编写高性能的javascript代码(持续更新)

    参考资料: Vanilla JS——世界上最轻量的JavaScript框架(没有之一) http://segmentfault.com/a/1190000000355277 探索高效jQuery的奥秘 ...

随机推荐

  1. shiro loginUrl拦截无效

    logUrl不拦截 或者 只跳转到/login.jsp 不跳到自己设置登录链接 在springmvc或事务那里 开启spring的显示代理(即cglib),并将shiro的安全管理器交给spring管 ...

  2. 32.js 判断当前页面是否被浏览

    可以通过document.hidden属性判断当前页面是否是激活状态. 兼容性:IE10+,Firefox10+,Chrome14+,Opera12.1+,Safari7.1+ 兼容性写法示例: va ...

  3. ruby中的alias和alias_method

    ruby中的alias和alias_method都可以重命名一个方法,它们的区别如下: 1.alias是ruby的一个关键字,因此使用的时候是alias :newname :oldname alias ...

  4. C++/Java线程之分

    JAVA线程状态图 1.C++/windows中主线程结束,其他线程必然死亡(即使调用pthread_detach解除父子关系,主线程消亡时也会导致子线程被迫关闭). ----1.1 一个进程中可以有 ...

  5. Sql 嵌套循环

    DECLARE @i INT ,@j INT BEGIN PRINT 'satrt i:'+CAST(@i AS varchar) BEGIN PRINT 'j:'+CAST(@j AS varcha ...

  6. [openjudge-动态规划]买书

    题目描述 描述 小明手里有n元钱全部用来买书,书的价格为10元,20元,50元,100元.问小明有多少种买书方案?(每种书可购买多本) 输入 一个整数 n,代表总共钱数.(0 <= n < ...

  7. springmvc静态资源无法加载

    springmvc拦截所有请求,用/: <servlet> <servlet-name>springmvc</servlet-name> <servlet-c ...

  8. Vim 文本编辑器的基本使用

    Vim文本编辑器是Linux/Unix系统下最常用的工具之一,通过该工具可以很方便的建立.修改.编辑文档或者程序文件,其作用类似与windows系统下的记事本或者notepad++,因此熟练掌握该工具 ...

  9. jQuery图片懒加载插件jquery.lazyload.js使用实例注意事项说明

    jQuery图片懒加载插件jquery.lazyload.js使用实例注意事项说明 jquery.lazyload.js是一个用JavaScript编写的jQuery插件.它可以延迟加载长页面中的图片 ...

  10. java springboot activemq 邮件短信微服务,解决国际化服务的国内外兼容性问题,含各服务商调研情况

    java springboot activemq 邮件短信微服务,解决国际化服务的国内外兼容性问题,含各服务商调研情况 邮件短信微服务 spring boot 微服务 接收json格式参数 验证参数合 ...