OpenCV基本数据类型:Mat

  ////myopencv.pro文件

  QT       += core gui

  greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

  CONFIG += c++11

  # The following define makes your compiler emit warnings if you use
  # any Qt feature that has been marked deprecated (the exact warnings
  # depend on your compiler). Please consult the documentation of the
  # deprecated API in order to know how to port your code away from it.
  DEFINES += QT_DEPRECATED_WARNINGS

  # You can also make your code fail to compile if it uses deprecated APIs.
  # In order to do so, uncomment the following line.
  # You can also select to disable deprecated APIs only up to a certain version of Qt.
  #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the  APIs deprecated before Qt 6.0.0

  SOURCES += \
      main.cpp \
      myopencv.cpp

  HEADERS += \
      myopencv.h

  # Default rules for deployment.
  qnx: target.path = /tmp/$${TARGET}/bin
  else: unix:!android: target.path = /opt/$${TARGET}/bin
  !isEmpty(target.path): INSTALLS += target

  INCLUDEPATH +=D:\Professional\OpenCV\OpenCVMinGW\OpenCV-MinGW-Build-OpenCV-4.5.2-x64\include
    
  //动态链接库位置
  LIBS +=D:\Professional\OpenCV\OpenCVMinGW\OpenCV-MinGW-Build-OpenCV-4.5.2-x64\x64\mingw\bin\libopencv_core452.dll
  LIBS +=D:\Professional\OpenCV\OpenCVMinGW\OpenCV-MinGW-Build-OpenCV-4.5.2-x64\x64\mingw\bin\libopencv_highgui452.dll
  LIBS +=D:\Professional\OpenCV\OpenCVMinGW\OpenCV-MinGW-Build-OpenCV-4.5.2-x64\x64\mingw\bin\libopencv_imgproc452.dll
  LIBS +=D:\Professional\OpenCV\OpenCVMinGW\OpenCV-MinGW-Build-OpenCV-4.5.2-x64\x64\mingw\bin\libopencv_calib3d452.dll
  LIBS +=D:\Professional\OpenCV\OpenCVMinGW\OpenCV-MinGW-Build-OpenCV-4.5.2-x64\x64\mingw\bin\libopencv_imgcodecs452.dll
  LIBS +=D:\Professional\OpenCV\OpenCVMinGW\OpenCV-MinGW-Build-OpenCV-4.5.2-x64\x64\mingw\bin\libopencv_videoio452.dll
  ////myopencv.h文件:

  #ifndef MYOPENCV_H
  #define MYOPENCV_H

  #include <QWidget>

  ////核心模块,OpenCV库的基本构建块
  #include "opencv2/core/core.hpp"

  ////图像编码模块,提供read、write等方法
  #include "opencv2/imgcodecs/imgcodecs.hpp"

  ////图像处理模块
  #include "opencv2/imgproc/imgproc.hpp"//image process

  ////包含创建/释放窗口、载入/保存图像、显示图像等方法
  #include "opencv2/highgui/highgui.hpp"

  class myOpenCV : public QWidget
  {
      Q_OBJECT

  public:
      myOpenCV(QWidget *parent = nullptr);
      ~myOpenCV();

  public:
      ////将OpenCV的矩阵数据转换为QPixmap的函数
      QPixmap matricsToPixmap(const cv::Mat& myMat);
  };
  #endif // MYOPENCV_H
////myopencv.cpp文件:

#include "myopencv.h"
#include <QLabel>
#include <QDebug>
#include <iostream>

using namespace cv;

myOpenCV::myOpenCV(QWidget *parent)
    : QWidget(parent)
{
    QLabel* myLabel = new QLabel(this);
    myLabel->setGeometry(0, 0, 960, 540);
        
    //读取一张图片
    Mat myMat = imread("C:/Users/12615/Pictures/Saved Pictures/ZJN.jpeg",1);
        
    ////OpenCV显示图片的方法
    //imshow("myMat", myMat);

    /*
    注意:
    1、Mat对象的数据结构几乎只包括矩阵头Header和指向数据的指针两部分构成。
    2、为了节省资源和处理速度,处理Mat对象的复制运算符(包括拷贝构造、矩阵赋值等)
    仅将矩阵头和指向矩阵数据的指针复制,而不会复制矩阵数据本身。因此,这样创建出来
    的Mat对象都指向同一片矩阵数据,对其中一个修改就会导致其它的复制品的值发生变化。
    3、基于上述,矩阵数据本身会属于多个Mat对象。矩阵数据本身引入了计数器机制,即
    增加一个引用矩阵数据本身的Mat对象时,就会增加一个矩阵头,清理对于Mat对象时,
    矩阵头就会减少。当矩阵头计数器减少为0时,释放矩阵数据本身。
    4、clone()和copyTo()方法与上述不同,是真正的克隆了矩阵数据,对克隆体进行修改不会影响原数据。
    */

    ////矩阵克隆
    Mat myMatA = myMat.clone();

    ////输出矩阵的数据值
    //std::cout<<myMatA<<std::endl<<std::endl;

    ////截取图像的某一区域
    Mat myMatB = Mat(myMat, Rect(20, 20, 400, 400));

    ////Scalar()方法用于将Mat对象所有数据初始化为自定义的值,例如此处为58。
    ////CV_[每个项目的位数][有符号或无符号][类型前缀]C(通道号)
    Mat myMatC = Mat(400, 400, CV_8UC(1), Scalar(58));

    ////CV_[每个项目的位数][有符号或无符号][类型前缀]C[通道数]
    Mat myMatD(2, 2, CV_8UC3, Scalar(168, 140, 0));

    std::cout<<myMatD<<std::endl<<std::endl;
    /*
    打印可得:[168, 140,   0, 168, 140,   0;
              168, 140,   0, 168, 140,   0]
    */

    ////create可以为Mat重新分配尺寸,但不可用于构造初始化!!!
    myMatD.create(1, 1, CV_8UC3);
    std::cout<<myMatD<<std::endl<<std::endl;
    /*
    打印可得:[ 12,   0,   0]
    */

    ////randu()可为矩阵元素用随机值初始化,需要指定随机数上下限。
    randu(myMatD, Scalar::all(0), Scalar::all(255));
        
    //将myMatE的三个通道(R、G、B)的所有元素数据值都赋为0~255中的任意一个数。
    Mat myMatE(960, 540, CV_8UC3);
    randu(myMatE, Scalar::all(0), Scalar::all(255));
        
    //输出结果为像素色彩为随机的图片
    myLabel->setPixmap(matricsToPixmap(myMatE));
}

QPixmap myOpenCV::matricsToPixmap(const cv::Mat& myMat)
{
    cv::Mat myMatA;
    //检测矩阵是否为空
    if(!(myMat.empty()))
    {
        ////色彩空间转换。OpenCV的默认读取方式为BGR
        cv::cvtColor(myMat, myMatA, COLOR_BGR2RGB);
        ////将OpenCV的矩阵数据转换为QImage
        QImage myQImageA = QImage((const unsigned char*)(myMatA.data), myMatA.cols, myMatA.rows, myMatA.step, QImage::Format_RGB888);
        return QPixmap::fromImage(myQImageA);
    }
    else
    {
        qDebug()<<"Failed to convert the matrics !!!"<<endl;
        myMatA = myMat.clone();
        QImage myQImageA = QImage((const unsigned char*)(myMatA.data), myMatA.cols, myMatA.rows, myMatA.step, QImage::Format_RGB888);
        return QPixmap::fromImage(myQImageA);
    }
}

myOpenCV::~myOpenCV()
{
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容