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

简介: 从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练1综述http://www.cnblogs.com/jsxyhelu/p/7907241.html2环境架设http://www.cnblogs.
最后,我们必须完成一个综合实验,来验证前面所做的一切工作。为了达到这个目的,将实验设定为:使用实时根据图像的特征(包括 ORB/SHIFT/SURF/BRISK),进行特征比对 。这样,就验证了opencv类库的编译(因为使用了contrib库,所以必须自己编译)、基本程序框架的运行(涉及摄像头操作)。并且我们是使用虚拟机(PC版本的PI系统)编译测试,而后移植到PI上面去的。
配置文件:
#
# Project created by QtCreator 2017 - 11 - 29T07 : 39 : 32
#
# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4) : QT += widgets

TARGET = GOQTTemplate2
TEMPLATE = app


INCLUDEPATH += /usr /local / include /opencv \
                /usr /local / include /opencv2

LIBS += /usr /local /lib /libopencv_world.so

SOURCES += main.cpp\
        mainwindow.cpp \
    clickedlabel.cpp

HEADERS   += mainwindow.h \
    clickedlabel.h

FORMS     += mainwindow.ui
主程序文件,简单说明流程:程序一开始就打开默认的摄像头,而后截获显示摄像头获取的数据。当有点击图片的操作的时候,保存当前图片作为模板,而后开始特征点匹配,并且显示匹配结果。有一个按钮能够切换不同的特征点算法:
//by jsxyhelu 2017/12/6
# include "mainwindow.h"
# include "ui_mainwindow.h"
# include <QMouseEvent >
//全局变量
Mat src;
Mat gray;
Mat tmp;
Mat dst;
Mat matMatch; //template
double m_lastTime; //time
Mat grayLeft;
Mat grayRight;
Mat descriptorsLeft;
std : :vector <KeyPoint > keypointsLeft;
Mat descriptorsRight;
std : :vector <KeyPoint > keypointsRight;
std : :vector < DMatch > matches;
std : :vector < DMatch > good_matches;
Mat img_matches;
int imethod; //0-ORB 1-SIFT 2-SURF 3-BRISK
using namespace cv;
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(); //main process
    //take a picture
    clickLabel = new ClickedLabel( this);
    clickLabel - >setGeometry( 0, 0, 800, 400);
    connect(clickLabel,SIGNAL(clicked(ClickedLabel *)), this,SLOT(on_pushButton_3_clicked()));
    imethod = 0; //ORB
    setWindowState(Qt : :WindowMaximized); //max
}
MainWindow : : ~MainWindow()
{
    delete ui;
}
////////////////////////////////////事件驱动///////////////////////////////////////////////////////
//打开摄像头
void MainWindow : :on_pushButton_clicked()
{
    //打开摄像头,从摄像头中获取视频
    videocapture   = new VideoCapture( 0);
    // 开始计时,超时则发出timeout()信号
    timer - >start( 33);
}
//main process 读取下一Frame图像 when timeout()
void MainWindow : :readFarme()
{
    // 从摄像头中抓取并返回每一帧
    videocapture - >read(matFrame);
    src = matFrame.clone();
    m_lastTime = ( double)getTickCount();
    tmp = matFrame.clone();
    //final
    cv : :resize(tmp,tmp,Size( 200, 200));
    dst = Mat(Size(tmp.cols * 2,tmp.rows),tmp.type(),Scalar( 255));
    tmp.copyTo(dst(cv : :Rect( 0, 0, 200, 200)));
    //生成特征点算法及其匹配方法
    Ptr <Feature2D >  extractor;
    BFMatcher matcher;
    switch (imethod)
           {
                    case 1 : //"SIFT"
                        extractor = SIFT : :create();
                        matcher = BFMatcher(NORM_L2);
                        break;
                    case 2 : //"SURF"
                        extractor = SURF : :create();
                        matcher = BFMatcher(NORM_L2);
                        break;
                    case 3 : //"BRISK"
                        extractor = BRISK : :create();
                        matcher = BFMatcher(NORM_HAMMING);
                        break;
                    case 0 : //"ORB"
                        extractor = ORB : :create();
                        matcher = BFMatcher(NORM_HAMMING);
                        break;
             }

    if(matMatch.rows > 0)
    {
        //利用现有数据结构,对比对结构进行筛选
        double max_dist = 0; double min_dist = 100;
          //action
        cv : :resize(matMatch,matMatch,Size( 200, 200));
        //gray
        cvtColor(tmp,grayLeft,COLOR_BGR2GRAY);
        cvtColor(matMatch,grayRight,COLOR_BGR2GRAY);
        //寻找到特征点
        extractor - >detectAndCompute(grayLeft,Mat(),keypointsLeft,descriptorsLeft);
        extractor - >detectAndCompute(grayRight,Mat(),keypointsRight,descriptorsRight);
        matcher.match( descriptorsLeft, descriptorsRight, matches );
        //对现有距离进行排序
        for( int i = 0; i < descriptorsLeft.rows; i ++ )
        {
            double dist = matches[i].distance;
            if( dist < min_dist ) min_dist = dist;
            if( dist > max_dist ) max_dist = dist;
        }
        for( int i = 0; i < descriptorsLeft.rows; i ++ )
        {
            if( matches[i].distance < = max( 2 *min_dist, 0. 02) )
            {
                good_matches.push_back( matches[i]);
            }
        }
         drawMatches( tmp, keypointsLeft, matMatch, keypointsRight, good_matches, dst );
          //clear
         good_matches.clear();
    }
    cv : :resize(dst,dst,Size( 800, 400));
    switch (imethod)
    {
    case 0 :
    putText(dst, "METHOD:ORB",Point( 10, 350),CV_FONT_HERSHEY_DUPLEX, 1.0f,Scalar( 0, 0, 255));
    break;
    case 1 :
     putText(dst, "METHOD:SIFT",Point( 10, 350),CV_FONT_HERSHEY_DUPLEX, 1.0f,Scalar( 0, 0, 255));
    break;
    case 2 :
     putText(dst, "METHOD:SURF",Point( 10, 350),CV_FONT_HERSHEY_DUPLEX, 1.0f,Scalar( 0, 0, 255));
    break;
    case 3 :
     putText(dst, "METHOD:BRISK",Point( 10, 350),CV_FONT_HERSHEY_DUPLEX, 1.0f,Scalar( 0, 0, 255));
    break;
    }
    // 格式转换
    QPixmap qpixmap = Mat2QImage(dst);
    // 将图片显示到label上
    clickLabel - >setPixmap(qpixmap);
    m_lastTime = ( double)getTickCount();
}
//method
void MainWindow : :on_pushButton_2_clicked()
{   
    if(imethod == 4)
    {
        imethod = 1;
    } else
    {
        imethod += 1;
    }
}
//action
void MainWindow : :on_pushButton_3_clicked()
{
      matMatch = src.clone();
}

//exit
void MainWindow : :on_pushButton_4_clicked()
{
    timer - >stop();         // 停止读取数据。
    videocapture - >release();
    //exit
    QApplication * app;
    app - >exit( 0);
}
//////////////////////////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_Indexed8 );
    }
    QPixmap qimg = QPixmap : :fromImage(img) ;
    return qimg;
}
 
 





附件列表

 

目前方向:图像拼接融合、图像识别 联系方式: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技术。
127 9
基于QT的OCR和opencv融合框架FastOCRLearn实战
|
1月前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
322 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
2月前
|
存储 计算机视觉
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
本文介绍了使用OpenCV进行图像读取、显示和存储的基本操作,以及如何绘制直线、圆形、矩形和文本等几何图形的方法。
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
|
2月前
|
计算机视觉
基于QT的opencv插件框架qtCvFrameLearn实战
这篇文章详细介绍了如何基于Qt框架开发一个名为qtCvFrameLearn的OpenCV插件,包括项目配置、插件加载、Qt与OpenCV图像转换,以及通过各个插件学习OpenCV函数的使用,如仿射变换、卡通效果、腐蚀、旋转和锐化等。
44 10
|
2月前
|
机器学习/深度学习 Java 计算机视觉
opencv4.5.5+qt5.15.2+vtk9.1+mingw81_64编译记录
本文记录了使用mingw81_64编译OpenCV 4.5.5、Qt 5.15.2、VTK 9.1的详细过程,包括编译结果截图、编译步骤、遇到的问题及其解决方案,以及相关参考链接。文中还提到了如何编译boost源码为静态库,并提供了测试代码示例。
opencv4.5.5+qt5.15.2+vtk9.1+mingw81_64编译记录
|
2月前
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
49 4
|
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
|
5月前
|
算法 计算机视觉
【Qt&OpenCV 图像的感兴趣区域ROI】
【Qt&OpenCV 图像的感兴趣区域ROI】
165 1