Opecv就是做計算機視覺,就是讲图片转换成计算机所能识别的数据

Mat类中由大量的内联函数,主要就是用于提高速度。

一般类型都用rgb,存的时候用CV_8UC3.create函数一般会把原来的空间释放。释放由opencv自动管理。但有时需要手动释放。

 

有时计算机会按照四字节对齐,所以step[0],表示二维矩阵中一行的字节数,只会比真正的实际存储的字节数多。

添加计时器:

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
void PrintMs(const char* test=""){
    static long long last=0;
    long long cur=getTickCount();
    if(last==0){
        last=cur;
        return;
    }
    long long ms;
    ms=(double)((cur-last)/getTickFrequency())*1000;
    if(*test!=0){
        cout<<"time : "<<ms<<endl;
    }
    last=getTickCount();
}
int main(int argc, char *argv[])
{
    Mat mat(3000,4000,CV_8UC3);
    mat.create(3000,4000,CV_8UC3);
    int es=mat.elemSize();
    int size=mat.rows*mat.cols*es;
    cout<<mat.isContinuous()<<endl;
    PrintMs();
    for(int i=0;i!=size;i+=es){
        mat.data[i]=255;//B
        mat.data[i+1]=110;//G
        mat.data[i+2]=60;//R
    }
    PrintMs("mat");
    for(int i=0;i!=mat.rows;++i){
        for(int j=0;j!=mat.cols;++j){
            (&mat.data[i*mat.step[0]])[j*es]=0;//B
            (&mat.data[i*mat.step[0]])[j*es+1]=0;//G
            (&mat.data[i*mat.step[0]])[j*es+2]=0;//R
        }
    }
    PrintMs("Mat");
    namedWindow("mat");
    imshow("mat",mat);
    waitKey(0);
    return 0;
}

这种方法会抛出异常

for(int i=0;i<mat.rows;++i){
        for(int j=0;j <mat.cols;++j){
            Vec3b* c=mat.ptr<Vec3b>(i,j);
            c->val[0]=0;//val[0]就是最基本的那个数据类型。c指向的是一个类
            c->val[1]=255;//G
            c->val[2]=0;
        }
    }
    PrintMs("mat");

try{
    for(int i=0;i!=mat.rows;++i){
        for(int j=0;j!=mat.cols;++j){
            Vec3b& m=mat.at<Vec3b>(i,j);//返回的是一个引用。
            m[0]=100;
            m[1]=100;
            m[2]=100;
        }
    }}
    catch(Exception& ex){
        cout<<ex.what()<<endl;
    }

for(int i=0;i!=mat.rows;++i){
        for(int j=0;j!=mat.cols;++j){
            Vec3s& m=mat.at<Vec3s>(i,j);
            //m[0]=0;
            //m[1]=0;
            //m[2]=100;
            m.val[0]=0;
            m.val[1]=0;
            m.val[2]=255;
        }
    }

其中m[0]与m.val[0]是一样的。都代表最基本的那个数据类型。注意Vec3s对应着CV_16SC3

添加OpenGL Widget,将其名称改为mat,class提升为MatView。

编译运行出错,因为没有定义MatView.h

MatView.h :

#ifndef MATVIEW_H
#define MATVIEW_H
#include<QOpenGLWidget>
class MatView:public QOpenGLWidget{
    Q_OBJECT
public:
    MatView(QWidget* p);
    ~MatView(){}
    void paintEvent(QPaintEvent* e);
};
#endif // MATVIEW_H

MatView.cpp   :

#include"matview.h"
#include<QImage>
#include<QPainter>
#include <opencv2/opencv.hpp>
using namespace cv;
void MatView::paintEvent(QPaintEvent* e){
    Mat src=imread("/home/ubuntu/Downloads/vn.jpg");
    cvtColor(src,src,COLOR_BGR2RGB);
    QImage img(src.data,src.cols,src.rows,QImage::Format_RGB888);
    QPainter painter;
    painter.begin(this);//clean
    painter.drawImage(QPoint(0,0),img);
    imwrite("/home/ubuntu/Downloads/nv.jpg",src);
}
MatView::MatView(QWidget* p):QOpenGLWidget(p){

}

第二章:Opencv核心類Mat的更多相关文章

  1. 第二章 JavaScript核心语法

    第二章   avaScript核心语法 一.变量的声明和赋值 JavaScript是一种弱类型语言,没有明确的数据类型,也就是在声明变量时不需要指定数据类型,变量的类型由赋给变量的值决定. 在Java ...

  2. C#高级编程笔记之第二章:核心C#

    变量的初始化和作用域 C#的预定义数据类型 流控制 枚举 名称空间 预处理命令 C#编程的推荐规则和约定 变量的初始化和作用域 初始化 C#有两个方法可以一确保变量在使用前进行了初始化: 变量是字段, ...

  3. 第二章:核心C#

    变量 如果在一条语句中声明和初始化了多个变量,那么所有的变量都具有相同的数据类型 Int x=10,y=20: 变量使用前需要赋初始值 声明不同类型的变量需要单独的语句. 变量的初始化 变量时类或者结 ...

  4. 学习opencv中文版教程——第二章

    学习opencv中文版教程——第二章 所有案例,跑起来~~~然而并没有都跑起来...我只把我能跑的都尽量跑了,毕竟看书还是很生硬,能运行能出结果,才比较好. 越着急,心越慌,越是着急,越要慢,越是陌生 ...

  5. c#高级编程第七版 学习笔记 第二章 核心c#

    第二章 核心C# 本章内容: 声明变量 变量的初始化和作用域 C#的预定义数据类型 在c#程序中使用条件语句.循环和跳转语句执行流 枚举 名称空间 Main()方法 基本的命令行c#编译器选项 使用S ...

  6. Python核心编程第三版第二章学习笔记

    第二章 网络编程 1.学习笔记 2.课后习题 答案是按照自己理解和查阅资料来的,不保证正确性.如由错误欢迎指出,谢谢 1. 套接字:A network socket is an endpoint of ...

  7. Android 系统移植与驱动开发--第二章搭建Android环境核心步骤及心得

    第二章 搭建Android 开发环境 虽然在这一章中讲的是Android底层开发环境,但是相应伴随的还有Android NDK程序来测试Linux驱动,HAL程序库.底层开发不仅需要交叉编译环境,还要 ...

  8. Python黑帽编程 2.0 第二章概述

    Python黑帽编程 2.0 第二章概述 于 20世纪80年代末,Guido van Rossum发明了Python,初衷据说是为了打发圣诞节的无趣,1991年首次发布,是ABC语言的继承,同时也是一 ...

  9. 《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型

    第二章 实体数据建模基础 很有可能,你才开始探索实体框架,你可能会问“我们怎么开始?”,如果你真是这样的话,那么本章就是一个很好的开始.如果不是,你已经建模,并在实体分裂和继承方面感觉良好,那么你可以 ...

随机推荐

  1. 开发人员如何从官网首页进入下载JDK历史版本

    就是下面的这篇文章,好心好意提交到百度经验,希望给需要的人一个帮助,结果被拒,说有广告.呵呵,oracle和java真的需要在你百度上面做广告吗?倒是能理解,可能是外行人做的,只是看到链接就拒了,但是 ...

  2. tar命令参数详解

    命令总览:tar [-]A --catenate --concatenate | c --create | d --diff --compare | r --append | t --list | u ...

  3. ThinkPHP最简教程

    这里不讲原理,只讲操作. 这里不说MVC,只说目录(文件夹)结构. 假设Apache Http Server.PHP.MySql都已经安装完毕并已配置完毕,能够输出phpinfo(). 框架是什么? ...

  4. 深度学习中将类别标签映射到one_hot向量

    有时我们的样本标签,都是标记从0开始直至到类别的个数.在模型训练的时候,这些标签需要变成one_hot向量,这样才能够跟softmax出来的概率做互熵损失,计算loss. 那么,映射的方法如下: de ...

  5. 1.7Oob 继承关系中构造方法的使用

    1:父类中最好要有一个空参数的构造方法,因为默认的构造方法在自定义了构造方法后就不存在了,需要显示的写出来. 若父类中没有空参数的构造方法,则子类必须有自定义的构造方法,且用super()调用父类的构 ...

  6. shell脚本之tr命令使用

    tr命令用来进行对标准输入的内容做替换.例如 # echo 'HELLO WORLD!!!' | tr "A-Z" "a-z" hello world!!! 这 ...

  7. 开启spark日志聚集功能

    spark监控应用方式: 1)在运行过程中可以通过web Ui:4040端口进行监控 2)任务运行完成想要监控spark,需要启动日志聚集功能 开启日志聚集功能方法: 编辑conf/spark-env ...

  8. Python:if __name__ == '__main__'

    简介: __name__是当前模块名,当模块被直接运行时模块名为_main_,也就是当前的模块,当模块被导入时,模块名就不是__main__,即代码将不会执行. 关于代码if __name__ == ...

  9. iOS10原生的语音转文字功能

    #import <Foundation/Foundation.h> #import <Speech/Speech.h> @interface SpeechListener : ...

  10. 子分区 复合分区 Subpartitioning

    https://dev.mysql.com/doc/refman/8.0/en/partitioning-subpartitions.html