OpenCV在MAC的Xcode的配置
最初的情况
之前利用brew install opencv
安装完后,在python3.9 import cv2
异常
而后在python3.8中
利用pip install opencv-python
在python3.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的配置
- 先配置两个路径 header search paths :/usr/local/include/opencv4 Library search paths:/usr/local/Cellar/opencv/(version)/lib
- 添加文件
在项目中右键新建一个 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]
- 配置图片文件路径
- 测试
测试程序
|
|
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 ]
利用iostream
中std: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