Opencv中mat总结

OpenCV在MAC的Xcode的配置

最初的情况

之前利用brew install opencv 安装完后,在python3.9 import cv2 异常 而后在python3.8中 利用pip install opencv-pythonpython3.8 下 import cv2 正常

但是 后来在xcode 配置时,出现错误:

[libprotobuf FATAL google/protobuf/stubs/common.cc:87] This program was compiled against version 3.13.0 of the Protocol Buffer runtime library, which is not compatible with the installed version (3.14.0). Contact the program author for an update. If you compiled the program yourself, make sure that your headers are from the same version of Protocol Buffers as your link-time library. (Version verification failed in "/tmp/opencv-20201117-12084-12qn56e/opencv-4.5.0/build/modules/dnn/opencv-caffe.pb.cc".)

像是protobuf不兼容的问题

几次尝试安装protobuf 没有结果 随后 卸载protoc

which protoc 
rm /usr/local/bin/protoc

安装3.14版本

重新安装opencv brew install opencv

安装的opencv版本是4.5.1.2.


Xcode的配置

  1. 先配置两个路径 header search paths :/usr/local/include/opencv4 Library search paths:/usr/local/Cellar/opencv/(version)/lib

  1. 添加文件

在项目中右键新建一个 new group,命名为lib,由于要添加文件目录的文件在隐藏路径中,需要shift+command+g才能访问,并把/usr/local/cellar/opencv/4.0.1/lib 路径目录下的所有*.dylib文件都添加到新建的group

!()[https://img-blog.csdnimg.cn/20200522203831693.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NodXh1ZXpoZWVyZXI=,size_16,color_FFFFFF,t_70]

  1. 配置图片文件路径

  1. 测试

测试程序

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
int main(int argc, char** argv) {
    Mat image;
    image = imread("/Users/Admin/Desktop/myProject/1.jpg", 1);//此改为自己的路径,查看一个文件的路径方法,将文件拖入到终端里即可查看路径
    namedWindow("Display Image", WINDOW_AUTOSIZE);
    imshow("Display Image", image);
    
    Mat gray;
    cvtColor(image, gray, COLOR_RGBA2GRAY);
    namedWindow("gray");
    imshow("gray", gray);
    
    waitKey(0);
    return 0;
}

OpenCV中Mat类详解

Mat本质上是由两个数据部分组成的类: (包含信息有矩阵的大小,用于存储的方法,矩阵存储的地址等) 的 矩阵头一个指针,指向包含了像素值的矩阵(可根据选择用于存储的方法采用任何维度存储数据)。矩阵头部的大小是恒定的。

矩阵本身的大小因图像的不同而不同,通常是较大的数量级。

图像的计算旺旺设计很大量的处理算法

OpenCV 使用引用计数系统。其思想是Mat的每个对象具有其自己的头,但可能他们通过让他们矩阵指针指向同一地址的两个实例之间共享该矩阵。此外,拷贝运算符将只能复制矩阵头部,也还将复制指针到大型矩阵,但不是矩阵本身。

使用clone () 或copyTo () 函数将复制的图像的基础矩阵。

存储方法

RGB 是最常见的是我们的眼睛使用类似的事情,我们显示系统还撰写使用这些颜色。

YCrCb 使用流行的 JPEG 图像格式。

CIE L ba 是均匀颜色空间,它是非常方便的如果您需要测量给定的颜色,以另一种颜色的距离。


Mat()构造函数

Mat M(2,2,CV_8UC3,Scalar(0,0,255));

M = 
    [0,0,255,0,0,255;
     0,0,255,0,0,255 ]

利用iostreamstd:cout显示:

cout << "M = "<<endl<<" "<<M<<endl<<endl;

对于二维的和多通道的图像,我们首先定义他们的大小:按行和列计数

然后指定其数据类型,用于存储元素和每个矩阵点通道的数量. 约定可以作出多个定义:

CV_ [每一项的位数] [有符号或无符号] [类型前缀] C [通道数]

CV_8UC3意味着使用那些长的8位无符号的char类型和每个元素都有三个项目的三个通道的形成.

CV_8UC1// 8位无符号单通道
CV_8UC3// 8位无符号3通道
CV_8UC4
CV_32FC1// 32位浮点型单通道
CV_32FC3// 32位浮点型3通道
CV_32FC4
• CV_8U-8 位无符号整数 (0…..255)
• CV_8S-8 位符号整数 (-128…..127)
• CV_16U-16 位无符号整数 (0……65535)
• CV_16S-16 位符号整数 (-32768…..32767)
• CV_32S-32 位符号整数 (-2147483648……2147483647)
• CV_32F-32 位浮点数 (-FLT_MAX ………FLT_MAX,INF,NAN)
• CV_64F-64 位浮点数(-DBL_MAX ……….DBL_MAX,INF,NAN)

包括数据位深度8位、32位,数据类型U:uchar、F:float型以及通道数C1:单通道、C3:三通道、C4:四通道。

Mat E = Mat::eye(4, 4, CV_64F);
cout << "E = " << endl << " " << E << endl << endl;
Mat O = Mat::ones(2, 2, CV_32F);
cout << "O = " << endl << " " << O << endl << endl;
Mat Z = Mat::zeros(3,3, CV_8UC1);
cout << "Z = " << endl << " " << Z << endl << endl;

对于小的矩阵,可以使用都好隔开的初始化函数:

Mat C = (Mat_<double>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
cout << "C = " << endl << " " << C << endl << endl;

为一个已有的Mat对象创建一个新的头然后clone()或者copyTo()这个头.

Mat RowClone = C.row(1).clone();
cout << "RowClone = " << endl << " " << RowClone << endl << endl;

可以通过randu()函数来产生随机值的填充矩阵. 给定上限和下限来确保随机值在期望范围内:

Mat R = Mat(3, 2, CV_8UC3);
randu(R, Scalar::all(0), Scalar::all(255));

2D点

Pointf P(5,1);
cout<<"Point (2D) = "<<P <<endl<<endl;

!()[http://hi.csdn.net/attachment/201203/4/0_1330857287d6Jp.gif]

3D点

Point3f  P3f(2, 6, 7);
cout << "Point (3D) = " << P3f << endl << endl;

std::vector通过 cv::Mat

vector<float> v;
v.push_back( (float)CV_PI); v.push_back(2); v.push_back(3.01f);
cout << "Vector of floats via Mat = " << Mat(v) << endl << endl;

!()[http://hi.csdn.net/attachment/201203/4/0_1330857370a0AH.gif]

点的std::vector

vector<Point2f> vPoints(20);
for (size_t E = 0; E < vPoints.size(); ++E)
vPoints[E] = Point2f((float)(E*5), (float)(E % 7));
cout << "A vector of 2D Points = " << vPoints << endl << endl;

Mat成员函数

Mat::~Mat: Mat的析构函数 C++:Mat::~Mat() 析构函数调用Mat::release()

Mat::operator=: 提供矩阵赋值操作

C++: Mat& Mat::operator=(const Mat& m)

C++: Mat& Mat::operator=(const MatExpr_Base& expr)

C++: Mat& Mat::operator=(const Scalar& s)

Mat::col 创建一个具有制定了局枕头中列数这个参数的矩阵

Mat::rowRange 为指定的行span创建一个新的矩阵头

Mat::colRange 为指定的行span创建一个矩阵头

Mat::diag 提取或创建矩阵对角线

Mat::clone 创建一个数据及其基础数据的万正副本

Mat::copyTo 把矩阵复制到另一个矩阵中

Mat::convertTo 在缩放或不缩放的情况下转换为另一种数据类型

Mat::assignTo 提供了一个converTo的功能形式

Mat::setTo 将阵列中所有的或部分的元素设置为指定的值

Mat::reshape 在无复制数据的前提下改变2D矩阵的形状和通道数或其中之一

Mat:: t 转置矩阵

Mat::inv 反转矩阵

Mat::mul 执行两个矩阵按元素相乘或两个矩阵的触发 Mat C = A.mul(5/B)

Mat::cross 计算3元素向量的一个叉乘积

Mat::dot 计算两向量的点乘 double N = M.dot(M);

Mat::zeros 返回指定的大小和类型的零数组

Mat::ones 返回一个指定的大小和类型的全为1的数组

Mat::create 分配新的矩阵数据

C++: void Mat::create(int rows, int cols, int type)

C++: void Mat::create(Size size, int type)

C++: void Mat::create(int ndims, const int* sizes, inttype)

参数

ndims – 新数组的维数。

rows –新的行数。

cols – 新的列数。

size – 替代新矩阵大小规格:Size(cols, rows)。

sizes – 指定一个新的阵列形状的整数数组。

type – 新矩阵的类型。

Mat::addref 计数器参考

Mat::release 在必要情况下,递减引用计数并释放该矩阵

Mat::resize 更改矩阵的行数

Mat::reserve 保留一定数量的行的空间

Mat::push_back 将元素添加到矩阵底部

Mat::locateROI 父矩阵内定位矩阵头

Mat::adjustROI 调整子阵大小及其在父矩阵中的位置

Mat::operaotr 提取矩形子阵

Mat::operator CvMat 创建矩阵CvMat 头

Mat::operator IplImage 创建IplImage矩阵头

Mat::total 返回数组元素的总数

Mat::isContinuous 返回矩阵是否连续

Mat::elemSize 返回矩阵元素大小

Mat:type 返回一个矩阵元素的类型

Mat::depth 返回一个矩阵元素的深度

Mat::channels 返回矩阵通道的数目

Mat::step1 返回矩阵归一化卖出的一步

Mat::size 返回一个矩阵大小

Mat::empyt 如果数组有没有elemens,则返回true

Mat::ptr 返回指定矩阵行的指针

Mat::at 返回对指定数组元素的引用

Mat::begin 返回矩阵迭代器,并将其设置为第一矩阵元

Mat::end 返回矩阵迭代器,并将其设置为最后元素之后的矩阵元


opencv在Qt下的配置

INCLUDEPATH += /usr/local/Cellar/opencv/4.5.1_2/include/opencv4/opencv2/
INCLUDEPATH += /usr/local/Cellar/opencv/4.5.1_2/include/opencv4/
INCLUDEPATH += /usr/local/Cellar/opencv/4.5.1_2/include/


LIBS += -L/usr/local/Cellar/opencv/4.5.1_2/lib  -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_imgcodecs

updatedupdated2021-03-032021-03-03