第二章:Opencv核心類Mat
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的更多相关文章
- 第二章 JavaScript核心语法
第二章 avaScript核心语法 一.变量的声明和赋值 JavaScript是一种弱类型语言,没有明确的数据类型,也就是在声明变量时不需要指定数据类型,变量的类型由赋给变量的值决定. 在Java ...
- C#高级编程笔记之第二章:核心C#
变量的初始化和作用域 C#的预定义数据类型 流控制 枚举 名称空间 预处理命令 C#编程的推荐规则和约定 变量的初始化和作用域 初始化 C#有两个方法可以一确保变量在使用前进行了初始化: 变量是字段, ...
- 第二章:核心C#
变量 如果在一条语句中声明和初始化了多个变量,那么所有的变量都具有相同的数据类型 Int x=10,y=20: 变量使用前需要赋初始值 声明不同类型的变量需要单独的语句. 变量的初始化 变量时类或者结 ...
- 学习opencv中文版教程——第二章
学习opencv中文版教程——第二章 所有案例,跑起来~~~然而并没有都跑起来...我只把我能跑的都尽量跑了,毕竟看书还是很生硬,能运行能出结果,才比较好. 越着急,心越慌,越是着急,越要慢,越是陌生 ...
- c#高级编程第七版 学习笔记 第二章 核心c#
第二章 核心C# 本章内容: 声明变量 变量的初始化和作用域 C#的预定义数据类型 在c#程序中使用条件语句.循环和跳转语句执行流 枚举 名称空间 Main()方法 基本的命令行c#编译器选项 使用S ...
- Python核心编程第三版第二章学习笔记
第二章 网络编程 1.学习笔记 2.课后习题 答案是按照自己理解和查阅资料来的,不保证正确性.如由错误欢迎指出,谢谢 1. 套接字:A network socket is an endpoint of ...
- Android 系统移植与驱动开发--第二章搭建Android环境核心步骤及心得
第二章 搭建Android 开发环境 虽然在这一章中讲的是Android底层开发环境,但是相应伴随的还有Android NDK程序来测试Linux驱动,HAL程序库.底层开发不仅需要交叉编译环境,还要 ...
- Python黑帽编程 2.0 第二章概述
Python黑帽编程 2.0 第二章概述 于 20世纪80年代末,Guido van Rossum发明了Python,初衷据说是为了打发圣诞节的无趣,1991年首次发布,是ABC语言的继承,同时也是一 ...
- 《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型
第二章 实体数据建模基础 很有可能,你才开始探索实体框架,你可能会问“我们怎么开始?”,如果你真是这样的话,那么本章就是一个很好的开始.如果不是,你已经建模,并在实体分裂和继承方面感觉良好,那么你可以 ...
随机推荐
- [No0000CA]什么是“普瑞马法则”?以及 如何利用“普瑞马法则”,三步克服惰性
一般在学习和生活中,我们都可能有这样的经验,就是当说想要作某件事情的时候,但过了好久发现还是没有做:或者觉得有力气使不出来:或者总觉得生活是灰色和抑郁的等等. 这类情况反映在生活中,就是生活好像总是被 ...
- 用CSS画基本图形
用CSS画基本图形 1.正方形 代码如下: #square { width: 100px; height: 100px; background: red; } 2.长方形 代码如下: #recta ...
- SPOJ - TSUM 母函数+FFT+容斥
题意:n个数,任取三个加起来,问每个可能的结果的方案数. 题解:构造母函数ABC,比如现在有 1 2 3 三个数.则 其中B表示同一个数加两次,C表示用三次.然后考虑去重. A^3表示可重复地拿三个. ...
- AndrewNG Deep learning课程笔记
神经网络基础 Deep learning就是深层神经网络 神经网络的结构如下, 这是两层神经网络,输入层一般不算在内,分别是hidden layer和output layer hidden layer ...
- 《HTTP - http报文》
还时推荐一首歌 - 那吾克热<纸飞机> 有没有突然想要个孩子的冲动,哈哈. 读 第三章<HTTP报文内的HTTP信息> 总结 1:用于HTTP协议交互叫做HTTP报文,请求端( ...
- spring boot动态数据源方案
动态数据源 1.背景 动态数据源在实际的业务场景下需求很多,而且想要沟通多数据库确实需要封装这种工具,针对于bi工具可能涉及到从不同的业务库或者数据仓库中获取数据,动态数据源就更加有意义. 2.依赖 ...
- 命令行颜色换算器(基于python)
import sys print(hex(int(sys.argv[1])<<16|int(sys.argv[2])<<8|int(sys.argv[3]))) 就两行代码 在 ...
- 使用Maven根据WSDL生成生成Java代码
转载:https://blog.csdn.net/pzasdq/article/details/52601473 为便于自己学习,整理 修改pom.xml <project xmlns=&quo ...
- shell下的几个命令
参考博客: https://www.cnblogs.com/-zyj/p/5760484.html 1. 批量删除筛选的文件夹 ls -l | grep ^d | xargs rm -rf 2. ...
- nodejs 学习二, nodejs调试
nodejs 调试,在官方文档(英文),常用的两种: 一个在chrome安装插件inspector 第二种利用编辑 这里我使用vscode编辑来调试. 主要是配置 launch.json(用vscod ...