OpenCV的Python API是基于Numpy的
在OpenCV中,最核心的类就是Mat,它是Matrix的缩写,代表矩阵和数组的意思,该类的声名在头文件opencv2\core\core.hpp中,所以引用Mat类时需要引入该头文件。
Mat的构造函数如下:
Mat(int rows, int cols , int type)
Mat(Size(int cols, int rows), int type) 注意Size这里是先列,然后才是行
//在C++中创建 Mat 类
// 方法1
Mat m = Mat(2,3,CV_32FC(1)); ###其中CV_32FC(1)代表的一种类型,32F就是占4字节的float,C(1)代表的是一个通道
//方法2
Mat m;
m.create(2,3,CV_32FC(1));
//方法3
Mat m = (Mat_(2,3) << 1,2,3,4,5,6);
//构造0矩阵
Mat m = Mat::zeros(2,3);
接下来看一些访问Mat对象中值的代码
//1.利用成员函数at访问
// m.at(r,c) 访问第r行第c列
//2.利用成员函数ptr
const int * ptr = m.ptr(r);//得到矩阵m的第r行的首地址
ptr[c]; //得到第r行的第c列
//2.利用成员变量data 和 step
//step[0]代表每一行所占的字节
//step[1]代表每一个数值所占的字节数
*((int*))(m.data+m.step[0]*r+m.step[1]);//访问一个Int类型的矩阵的第r行第c列
Mat的一些成员函数
1.使用成员函数row(i)或者col(j)获取矩阵的第i行或者第j列
Mat me = m.row(i);
2.使用成员函数rowRange或者colRange得到矩阵的连续行或者连续列
Mat r_range = m.rowRange(2,4);//得到第2,3行,但是使用这个成员函数返回的是原矩阵的引用
3.使用成员函数clone和copyTo
Mat r_range = m.rowRange(2,4).clone();
Mat r_range;
m.rowRange(2,4).copyTo(r_range);
//以上代码都实现了一份拷贝
这里的向量可以理解为列向量,Vec函数原型: Vec
//构造一个长度为3,数据类型为int 的列向量
Vec v(21,11,14);
//构造多通道Mat对象
//例如构造一个2 *2 的float类型的三通道矩阵
Mat mm= (Mat_(2,2)<(r,c); 第一种使用at成员函数
Vec3f *ptr = (Vec3f*)(mm.data + r * mm.step[0] + c * mm.step[1]);
cout << *ptr <<",";
}
cout<
第0列 | 第一列 | |
---|---|---|
第0行 | 1 11 21 | 2 12 22 |
第1行 | 3 13 23 | 4 14 24 |
OpenCV中提供的split可分离多通道,如将多通道矩阵mm分离为多个单通道,存储在vector中
OpenCV中提供的merge函数可用于将多个单通道矩阵合并为一个三通道的。
//分离
vector planes;
split(mm,planes);
//合并
vector planes;
planes.push_back(plane0);
planes.push_back(plane1);
planes.push_back(plane2);
Mat mat;
merge(plane,mat);
#include
#include
using namespace cv ;
int main(){
Mat img = imfead("路径名",图像类型,例如CV_LOAD_IMAGE_XX);
imshow("myView",img);
waitKey(0);//这一句一定要有
return 0;
}
import cv2
image =cv2.imread("D:\img.jpg",cv2.IMREAD_ANYCOLOR)
cv2.imshow("image",image)
##分离通道
b = image[:,:,0]
g = image[:,:,1]
r = image[:,:,2]
cv2.waitKey(0)
过两天把数字处理的作业也记录下,本科学的数字图像和研究生学的不是一个层次呀呀呀,老师上课感觉听得懂,课后练习题目一道都不会,还是多亏夸夸群友们让我坚持了几个小时写了下来!!!