OpenCV的Python API是基於Numpy的

1.認識OpenCV的Mat類

在OpenCV中,最核心的類就是Mat,它是Matrix的縮寫,代表矩陣和數組的意思,該類的聲名在頭文件opencv2corecore.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_<int>(2,3) << 1,2,3,4,5,6);

//構造0矩陣
Mat m = Mat::zeros(2,3);

接下來看一些訪問Mat對象中值的代碼

//1.利用成員函數at訪問
// m.at<typename>(r,c) 訪問第r行第c列

//2.利用成員函數ptr
const int * ptr = m.ptr<int>(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);
//以上代碼都實現了一份拷貝


2.認識Vec

這裡的向量可以理解為列向量,Vec函數原型: Vec

//構造一個長度為3,數據類型為int 的列向量
Vec<int,3> v(21,11,14);

//構造多通道Mat對象
//例如構造一個2 *2 的float類型的三通道矩陣
Mat mm= (Mat_<Vec3f>(2,2)<<Vec3f(1,1,1),Vec3f(1,1,1),
Vec3f(1,1,1),Vec3f(1,1,1));

//訪問多通道Mat的方法,Mat可以看作是一個特殊的二維數組,只是每個位置不是一個數值而是一個向量
for(int r = 0;r<mm.rowsl;r++)
{
for(int c =0;c<mm.cols;c++)
{
//cout<<mm.at<Vec3f>(r,c); 第一種使用at成員函數
Vec3f *ptr = (Vec3f*)(mm.data + r * mm.step[0] + c * mm.step[1]);
cout << *ptr <<",";
}
cout<<end;
}

| | 第0列 | 第一列 | | ----- | ------- | ------- | | 第0行 | 1 11 21 | 2 12 22 | | 第1行 | 3 13 23 | 4 14 24 |


3.分離通道與合併通道

OpenCV中提供的split可分離多通道,如將多通道矩陣mm分離為多個單通道,存儲在vector中

OpenCV中提供的merge函數可用於將多個單通道矩陣合併為一個三通道的。

//分離
vector<Mat> planes;
split(mm,planes);

//合併
vector<Mat> planes;
planes.push_back(plane0);
planes.push_back(plane1);
planes.push_back(plane2);
Mat mat;
merge(plane,mat);

4.c++與Python中讀取圖像

#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
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)


過兩天把數字處理的作業也記錄下,本科學的數字圖像和研究生學的不是一個層次呀呀呀,老師上課感覺聽得懂,課後練習題目一道都不會,還是多虧誇誇群友們讓我堅持了幾個小時寫了下來!!!


推薦閱讀:
相关文章