博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(3两个例子)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
阅读量:7072 次
发布时间:2019-06-28

本文共 4083 字,大约阅读时间需要 13 分钟。

从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练

1综述
2环境架设
3两个例子
4程序框架
5编译使用最新opencv
6综合实验
7拾遗

一、第一个例子
    
其实在目前这种情况下,配置OpenCV+QT的环境还是非常直接,简单的。
    
最为重要的是编写正确的.pro文件,再原有基础上添加以下内容:
INCLUDEPATH
+=
/usr
/
include
/opencv \
               
/usr
/
include
/opencv2
LIBS
+=
/usr
/lib
/gnueabihf
/libopencv_highgui.so \
       
/usr
/lib
/gnueabihf
/libopencv_core.so    \
       
/usr
/lib
/gnueabihf
/libopencv_imgproc.so
       
指向正确的include和lib文件。实现以下结果,读取显示lena.jpg
 
#
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();
}
 
主要代码已经非常类似windows下的编写方式,唯一不同的就是添加了QImage和mat之间的转换。
二、第二个例子
    
图像处理必须和摄像头打交道,具体的配置请看下一节。但是现在,如果直接使用USB摄像头,也应该能够进行操作:
头文件:
#
ifndef MAINWINDOW_H
#
define MAINWINDOW_H
#
include
<QMainWindow
>
//新添加
#
include
<opencv2
/core
/core.hpp
>
#
include
<opencv2
/highgui
/highgui.hpp
>
#
include
<opencv2
/imgproc
/imgproc.hpp
>
#
include
<QFileDialog
>
#
include
<QImage
>
#
include
<QTimer
>    
// 设置采集数据的间隔时间
using
namespace cv;
//helper函数
QPixmap Mat2QImage(Mat src);
namespace Ui {
class MainWindow;
}
class MainWindow
:
public QMainWindow
{
    Q_OBJECT
public
:
   
explicit MainWindow(QWidget
*parent
=
0);
   
~MainWindow();
private slots
:
   
void on_pushButton_clicked();
   
void on_pushButton_2_clicked();
   
void on_pushButton_3_clicked();
   
void readFarme();      
// 读取当前帧信息
   
void on_pushButton_4_clicked();
private
:
    Ui
:
:MainWindow
*ui;
    QTimer   
*timer;
    QImage   
*imag;
    VideoCapture
*videocapture;  
// 视频获取结构, 用来作为视频获取函数的一个参数
    Mat          matFrame;       
//申请IplImage类型指针,就是申请内存空间来存放每一帧图像
   
bool      bMethod;
//是否使用算法
};
#
endif
// MAINWINDOW_H
 
 
程序文件,注意我做了进一步集成:
#
include
"mainwindow.h"
#
include
"ui_mainwindow.h"
using
namespace cv;
//全局变量
Mat src;
Mat gray;
Mat tmp;
Mat dst;
MainWindow
:
:MainWindow(QWidget
*parent)
:QMainWindow(parent),ui(
new Ui
:
:MainWindow)
{
    ui
-
>setupUi(
this);
    timer  
=
new QTimer(
this);
    imag   
=
new QImage();        
// 初始化
    connect(timer, SIGNAL(timeout()),
this, SLOT(readFarme())); 
// 时间到,读取当前摄像头信息
    bMethod
=
false;
//是否使用算法
}
MainWindow
:
:
~MainWindow()
{
   
delete ui;
}
//事件驱动
//打开摄像头
void MainWindow
:
:on_pushButton_clicked()
{
   
//打开摄像头,从摄像头中获取视频
    videocapture 
=
new VideoCapture(
0);
   
// 开始计时,超时则发出timeout()信号
    timer
-
>start(
33);
}
//读取下一Frame图像
void MainWindow
:
:readFarme()
{
   
// 从摄像头中抓取并返回每一帧
    videocapture
-
>read(matFrame);
   
//图像处理
   
if(bMethod)
    {
        cvtColor(matFrame,tmp,COLOR_BGR2GRAY);
        Canny(tmp,dst,
30,
255);
    }
   
else
    {
        dst
= matFrame.clone();
    }
   
// 格式转换
    QPixmap qpixmap
= Mat2QImage(dst);
   
// 将图片显示到label上
    ui
-
>label
-
>setPixmap(qpixmap);
}
//拍照
void MainWindow
:
:on_pushButton_2_clicked()
{
   
// 格式转换
    QPixmap qpixmap
= Mat2QImage(dst);
   
// 将图片显示到label上
    ui
-
>label_2
-
>setPixmap(qpixmap);
}
//执行算法
void MainWindow
:
:on_pushButton_4_clicked()
{
    bMethod
=
!bMethod;
}
//关闭摄像头
void MainWindow
:
:on_pushButton_3_clicked()
{
    timer
-
>stop();        
// 停止读取数据。
    videocapture
-
>release();
}
//helper函数//
//格式转换
QPixmap Mat2QImage(Mat src)
{
    QImage img;
   
//根据QT的显示方法进行转换
   
if(src.channels()
==
3)
    {
        cvtColor( src, tmp, CV_BGR2RGB );
        img
= QImage( (
const
unsigned
char
*)(tmp.data), tmp.cols, tmp.rows, QImage
:
:Format_RGB888 );
    }
   
else
    {
        img
= QImage( (
const
unsigned
char
*)(src.data), src.cols, src.rows, QImage
:
:Format_Grayscale8 );
    }
    QPixmap qimg
= QPixmap
:
:fromImage(img) ;
   
return qimg;
}
 
  

目前方向:图像拼接融合、图像识别 联系方式:jsxyhelu@foxmail.com

转载地址:http://fbell.baihongyu.com/

你可能感兴趣的文章
openshift 安装
查看>>
我的友情链接
查看>>
关于安装oracle数据库
查看>>
我的友情链接
查看>>
java: command not found
查看>>
JavaScript继承方式详解
查看>>
烂泥:高负载均衡学习haproxy之安装与配置
查看>>
ASP.NET
查看>>
Java课程作业01
查看>>
php html 静态化 缓存
查看>>
Silverlight数据验证
查看>>
mysql中的锁
查看>>
Android的消息机制(1)
查看>>
Vue中v-for的数据分组
查看>>
ajax 无刷新下拉加载更多。
查看>>
linux运维人员常用的150个命令
查看>>
bzoj3068: 小白树
查看>>
常用算法Java实现之直接插入排序
查看>>
转载 radio值获取
查看>>
学习SpringMVC——你们要的REST风格的CRUD来了
查看>>