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

简介:  从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练 1综述http://www.cnblogs.com/jsxyhelu/p/7907241.html2环境架设http://www.

 

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

 

1综述
http://www.cnblogs.com/jsxyhelu/p/7907241.html
2环境架设
http://www.cnblogs.com/jsxyhelu/p/7908226.html
3两个例子
http://www.cnblogs.com/jsxyhelu/p/8000804.html
4程序框架
http://www.cnblogs.com/jsxyhelu/p/7953805.html
5编译使用最新opencv
http://www.cnblogs.com/jsxyhelu/p/8000819.html
6综合实验
http://www.cnblogs.com/jsxyhelu/p/8000829.html
7拾遗
http://www.cnblogs.com/jsxyhelu/p/8007117.html

  

为了方便后期图像处理相关操作运用,将前面的程序封装成框架以复用

一、打开PI自带的摄像头

sudo raspi -config

移动到“5”选项,按下回车键,选择camera。

选择“Enable”然后回车。

20131007211419547-0

再选择“Yes”,回车后树莓派会重新启动。

20131007211419511-0

通过raspi-config工具更新了操作并使能摄像头之后,它会告诉树莓派摄像头已经连接成功,并增加了两个命令行工具以供用户使用摄像头。

raspistill
raspivid
如果是usb摄像c,现在已经可以直接使用。但是如果想集成度搞一些,直接使用csi的摄像头,需要这样做:
 
cd /etc /modules -load.d /
sudo vim modules.conf
添加
bcm2835 -v4l2
 
需要重启。
二、编写程序,获取并显示实时视频
主要程序代码:
# ifndef CLICKEDLABEL_H
# define CLICKEDLABEL_H
# include <QWidget >
# include <QLabel >
class ClickedLabel : public QLabel
{
   Q_OBJECT
    public :
       ClickedLabel(QWidget *parent = 0) : QLabel(parent){}
        ~ClickedLabel() {}
   signals :
        void clicked(ClickedLabel * click); // ????
    protected :
        void mouseReleaseEvent(QMouseEvent *); // ?????????
};
# endif // CLICKEDLABEL_H
 
# 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 >      // 时间触发
# include  "clickedlabel.h"
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_MainWindow_iconSizeChanged( const QSize  &iconSize);
     void on_pushButton_clicked();
     void on_pushButton_2_clicked();
     void on_pushButton_3_clicked();
     void on_pushButton_4_clicked();
     void readFarme();        // 核心函数
private :
    Ui : :MainWindow  *ui;
    QTimer     *timer;
    QImage     *imag;
    VideoCapture  *videocapture;    
    Mat          matFrame;        
     bool      bMethod; //是否采用图像处理算法
    ClickedLabel  * clickLabel;
    ClickedLabel  * clickLabel2;
};

# endif  // MAINWINDOW_H
 
# include "clickedlabel.h"

void ClickedLabel : :mouseReleaseEvent(QMouseEvent *)
{
    emit clicked( this);
}
 
# include "mainwindow.h"
# include <QApplication >


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

    return a.exec();
}

 
# 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;
    on_pushButton_clicked();
    clickLabel = new ClickedLabel( this);
    clickLabel - >setGeometry( 0, 0, 400, 400);
    connect(clickLabel,SIGNAL(clicked(ClickedLabel *)), this,SLOT(on_pushButton_3_clicked()));
    clickLabel2 = new ClickedLabel( this);
    clickLabel2 - >setGeometry( 400, 0, 400, 400);
    connect(clickLabel2,SIGNAL(clicked(ClickedLabel *)), this,SLOT(on_pushButton_2_clicked()));
}

MainWindow : : ~MainWindow()
{
    delete ui;
}
void MainWindow : :on_MainWindow_iconSizeChanged( const QSize &iconSize)
{

}
//Open camera
void MainWindow : :on_pushButton_clicked()
{
    videocapture   = new VideoCapture( 0);
    timer - >start( 33);
}
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);
    clickLabel - >setPixmap(qpixmap);
}
//capture
void MainWindow : :on_pushButton_2_clicked()
{
    QPixmap qpixmap = Mat2QImage(dst);
    //ui->label_2->setPixmap(qpixmap);
     clickLabel2 - >setPixmap(qpixmap);
}
//action
void MainWindow : :on_pushButton_3_clicked()
{
      bMethod = !bMethod;
}
//exit
void MainWindow : :on_pushButton_4_clicked()
{
    timer - >stop();         // ???????
    videocapture - >release();
}
//////////////////////////helper??//////////////////////////////////////////////////
QPixmap Mat2QImage(Mat src)
{
    QImage img;
    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_Indexed8 );
    }
    QPixmap qimg = QPixmap : :fromImage(img) ;
    return qimg;
}
 
三、程序要点和结果展示
1、直接调用OpenCV的摄像头模块,实践证明在Linux上面很有效;
2、为了能够让label可以被点击,进行了一个类的重构工作;
至此,程序框架搭建完成,可以方便复用,完整代码在链接为:
 
 
 





附件列表

 

目前方向:图像拼接融合、图像识别 联系方式:jsxyhelu@foxmail.com
目录
相关文章
|
2月前
|
算法 计算机视觉
基于qt的opencv实时图像处理框架FastCvLearn实战
本文介绍了一个基于Qt的OpenCV实时图像处理框架FastCvLearn,通过手撕代码的方式详细讲解了如何实现实时人脸马赛克等功能,并提供了结果展示和基础知识回顾。
104 7
基于qt的opencv实时图像处理框架FastCvLearn实战
|
2月前
|
文字识别 计算机视觉 开发者
基于QT的OCR和opencv融合框架FastOCRLearn实战
本文介绍了在Qt环境下结合OpenCV库构建OCR识别系统的实战方法,通过FastOCRLearn项目,读者可以学习Tesseract OCR的编译配置和在Windows平台下的实践步骤,文章提供了技术资源链接,帮助开发者理解并实现OCR技术。
128 9
基于QT的OCR和opencv融合框架FastOCRLearn实战
|
1月前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
330 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
2月前
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
49 4
|
2月前
|
存储 计算机视觉
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
本文介绍了使用OpenCV进行图像读取、显示和存储的基本操作,以及如何绘制直线、圆形、矩形和文本等几何图形的方法。
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
|
2月前
|
计算机视觉
基于QT的opencv插件框架qtCvFrameLearn实战
这篇文章详细介绍了如何基于Qt框架开发一个名为qtCvFrameLearn的OpenCV插件,包括项目配置、插件加载、Qt与OpenCV图像转换,以及通过各个插件学习OpenCV函数的使用,如仿射变换、卡通效果、腐蚀、旋转和锐化等。
44 10
|
3月前
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
WK
|
3月前
|
编解码 计算机视觉 Python
如何在OpenCV中进行图像转换
在OpenCV中,图像转换涉及颜色空间变换、大小调整及类型转换等操作。常用函数如`cvtColor`可实现BGR到RGB、灰度图或HSV的转换;`resize`则用于调整图像分辨率。此外,通过`astype`或`convertScaleAbs`可改变图像数据类型。对于复杂的几何变换,如仿射或透视变换,则可利用`warpAffine`和`warpPerspective`函数实现。这些技术为图像处理提供了强大的工具。
WK
108 1
|
4月前
|
机器学习/深度学习 XML 计算机视觉
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
|
4月前
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
181 1
Qt(C++)开发一款图片防盗用水印制作小工具

推荐镜像

更多