• 基础学习笔记之opencv(8):Mat 基本图像容器


      实验说明:

      本文主要讲一些opencv 2.0版本后出现的Mat矩形类,主要是参考opencv自带doc文件夹下的tutiol教材。通过这次实验觉得用Mat的话下面几点需要特别注意(在代码中可以体现出来):

    1. 利用create函数重新改变Mat数据在内存中的布局。

    2. 注意多通道数据在Mat中其实也是占一个元素的位置的。

    3. 学会多维Mat的创建方法。

    4. Mat矩阵比较小时,学会直接赋值的方法,即用Mat_

       5.  掌握Mat矩阵内容输出到终端时的几种常见格式。

       6.  注意如果vector是单独一维的话需要转换成Mat才能输出,多维的可以直接输出,例如vector里面存放的是点的话。

       开发环境:Ubuntu12.04+Qt4.8.2+QtCreator2.5+opencv2.4.2

      实验结果:

      软件运行后界面(每按一下next,执行关于Mat的一部分代码):

      

      终端输出数据截图:

      

      实验代码和注释:

    mainwindow.h:

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
        
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
        
    private slots:
        void on_nextButton_clicked();
    
        void on_closeButton_clicked();
    
    private:
        Ui::MainWindow *ui;
        int next_num;
    };
    
    #endif // MAINWINDOW_H

    mainwindow.cpp:

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <iostream>
    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    
    using namespace std;
    using namespace cv;
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        //setStyleSheet为设置工作表的风格,其参数是一个Qstring类型,utf-8是unicode中一种变长编码
        //background-color为Qt Style Sheets的一个属性,具体的使用方法可以查看其帮助文档
        ui->textBrowser->setStyleSheet(QString::fromUtf8 ("background-color:black"));
        next_num = 0;
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::on_nextButton_clicked()
    {
        next_num ++;
        ui->textBrowser->setTextColor( Qt::green );
        switch (next_num)
            {
               case 1:
                {
                    ui->textBrowser->append
                            (
                                 "--------------------------------------------------------------------------\r"
                                 "This program shows how to create matrices(cv::Mat) in OpenCV and its serial"
                                 " out capabilities\r"
                                 "That is, cv::Mat M(...); M.create and cout << M.\r "
                                 "Shows how output can be formated to OpenCV, python, numpy, csv and C styles.\r"
                                 "Usage:\r"
                                 "./cvout_sample\r"
                                 "--------------------------------------------------------------------------\r"
                             );
                    break;
                }
               case 2:
                   {
                        Mat M( 2, 2, CV_8UC3, Scalar(0,255,0) );//其实是2*6的矩阵,因为每个元素有3个通道。
                        ui->textBrowser->append("create by using the constructor......" );
                        cout<<"M =   "<<M<<endl;
                        M.create( 4, 4, CV_8UC(2) );//括号里面的2表示2通道
                        ui->textBrowser->append( "create by using create function......" );
                        cout<<"M =   "<<M<<endl;
                        break;
                    }//当case语句里面变量定义时,需要用括号括起来,否则会报错
               case 3:
                    {
                        int sz[3] = {2, 2, 2};
                        Mat L( 3, sz, CV_8UC(1), Scalar::all(0) );
                        ui->textBrowser->append( "create multidimensional matrix......" );
                       // cout<<"L =   "<<L<<endl;此处不能打印出来,因为那只适应二维数组
                        break;
                    }
                case 4:
                    {
                        Mat E = Mat::eye(4, 4, CV_64F);
                        Mat O = Mat::ones(2, 3, CV_32F);
                        Mat Z = Mat::zeros(3, 3, CV_8UC1);
                        ui->textBrowser->append( "using matlab stytle......" );
                        cout<<"E =  "<<E<<endl;
                        cout<<"O =  "<<O<<endl;
                        cout<<"Z =  "<<Z<<endl;
                        break;
                    }
                case 5:
                    {
                        Mat C =(Mat_<double>(3,3)<<0,-1,0,-1,5,-1,0,-1,0);//直接赋初始值的方法
                        Mat row_clone = C.row(1).clone();
                        ui->textBrowser->append( "create 3*3 double-precision identity matrix......" );
                        cout<<"C =  "<<C<<endl;
                        cout<<"row_clone =  "<<row_clone<<endl;
                        break;
                    }
                case 6:
                    {
                        Mat R = Mat( 3, 2, CV_8UC3 );
                        randu( R, Scalar::all(0), Scalar::all(255) );
                        ui->textBrowser->append( "fill a matrix with rand numbers......" );
                        cout<<"R (default) =  "<<R<<endl;
                        ui->textBrowser->append( "demonstrate the output formating options......" );
                        cout<<"R (python) = "<<format(R, "python")<<endl;
                        cout<<"R (numpy) = "<<format(R, "numpy")<<endl;//numpy是一个用python实现的科学计算包
                        cout<<"R (csv) = "<<format(R, "csv")<<endl;//csv,逗号分隔符
                        cout<<"R (c) =" <<format(R, "C")<<endl;
                        break;
                    }
                case 7:
                    {
                        ui->textBrowser->append( "the point format output......" );
    
                        Point2f P1(5, 1);
                        cout<<"Point (2D) = "<<P1<<endl;
    
                        Point3f P2(4, 5, 6);
                        cout<<"Point (3D) = "<<P2<<endl;
    
                        vector<float>v;
                        v.push_back( (float)CV_PI);
                        v.push_back( 2 );//push_back为在其尾部加入一个数据
                        v.push_back( 3.01f );
                        cout<<"vector of float: =  "<<Mat(v)<<endl;//vector数据是没法单独输出的,因此可以借助mat输出
    
                        int N = 20;
                        vector<Point2f>vPoints(N);//vector可以用变量定义其长度,比数组好用
                        for( size_t E = 0; E < vPoints.size(); ++E )    //size_t其实就是一个unsigned int类型
                            vPoints[E] = Point2f((float)(E*5), (float)(E%7));
                        cout<<"vPoints[] =  "<<vPoints<<endl;//但是vector点确实可以直接输出的,因为这时候的vector本身就是
                                                             //一个多维(至少2维)Mat了
                        break;
    
                    }
                default:break;
            }
    
    }
    
    void MainWindow::on_closeButton_clicked()
    {
        close();
    }

    main.cpp:

    #include <QApplication>
    #include "mainwindow.h"
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
        
        return a.exec();
    }

     附:工程code下载. 

     

     

     

     

     

    作者:tornadomeet 出处:http://www.cnblogs.com/tornadomeet 欢迎转载或分享,但请务必声明文章出处。 (新浪微博:tornadomeet,欢迎交流!)
  • 相关阅读:
    多态
    抽象类和接口
    面向对象3
    类的继承 设计模式
    面向对象2
    面向对象
    复习
    对json的简单认识
    关于AJAX
    PHP配置开发环境
  • 原文地址:https://www.cnblogs.com/tornadomeet/p/2599376.html
Copyright © 2020-2023  润新知