1. 程式人生 > >OpenCV—基本資料結構與示例

OpenCV—基本資料結構與示例

OpenCV的基本資料結構及示例


OpenCV中強大的Mat型別大家已經比較熟悉了。這裡梳理一些在工程中其他經常用到的幾種基本資料型別。包括:

         Vec

         Scalar

         Point

         Size

         Rect

         RotatedRect

1. Vec

1.1 基本概念

         Vec是一個模板類,主要用於儲存數值向量。

1.2 用法

(1)可用它來定義任意型別的向量

Vec<double, 8> myVector; // 定義一個存放8個double型變數的向量

(2)使用[]訪問Vec向量成員         

myVector[0]=0;

 (3)可使用以下預定義的型別

typedef Vec<uchar, 2> Vec2b;
typedef Vec<uchar, 3> Vec3b;
typedef Vec<uchar, 4> Vec4b;
typedef Vec<short, 2> Vec2s;
typedef Vec<short, 3> Vec3s;
typedef Vec<short, 4> Vec4s;
typedef Vec<int, 2> Vec2i;
typedef Vec<int, 3> Vec3i;
typedef Vec<int, 4> Vec4i;
typedef Vec<float, 2> Vec2f;
typedef Vec<float, 3> Vec3f;
typedef Vec<float, 4> Vec4f;
typedef Vec<float, 6> Vec6f;
typedef Vec<double, 2> Vec2d;
typedef Vec<double, 3> Vec3d;
typedef Vec<double, 4> Vec4d;
typedef Vec<double, 6> Vec6d;

(4)Vec支援的運算如下:

	v1 = v2 + v3
	v1 = v2 - v3
	v1 = v2 * scale
	v1 = scale * v2
	v1 = -v2
	v1 += v2
	v1 == v2, v1 != v2
	norm(v1) (euclidean norm)

1.3 示例程式碼

(1)向量定義與元素的訪問

// Vec
     cv::Vec<double, 8>  myVector;
     for(int i=0; i<myVector.rows;i++)
          myVector[i] = i;
     cout<<"myVector= "<<myVector<<endl;
     cout<<"myVector[0]= "<<myVector[0]<<endl;
     cout<<"myVector[3]= "<<myVector[3]<<endl;
執行結果:

(2)基本運算

	cv::Vec<int, 6> v1,v2,v3;
        	for(int i=0; i<v2.rows;i++){ //v2.rows返回向量v2的行數
                   	v2[i] = i;
                   	v3[i] = i+1;
       		 }
        
         v1 = v2 + v3;
         cout<<"v2       = "<<v2<<endl;
         cout<<"v3       = "<<v3<<endl;
         cout<<"v1=v2+v3= "<<v1<<endl;
         cout<<"v1=v2*2  = "<<v2*2<<endl;
         cout<<"v1=-v2   = "<<-v2<<endl;
         cout<<"v1==v2   = "<<(v1==v2)<<endl;
         cout<<"v1!=v2   = "<<(v1!=v2)<<endl;
         cout<<"norm(v2)= "<<norm(v2)<<endl;

執行結果:

2. Scalar

2.1 基本概念

Scalar是一個從Vec類引出的模板類,是一個可存放4個元素的向量,廣泛用於傳遞和讀取影象中的畫素值。

2.2 用法

可使用[]訪問Scalar值。或使用如下方式定義BGR三個通道的值。

cv:: Scalar( B, G, R )

2.3 示例程式碼

(1)cv::Scalar結構

cv::Scalar myScalar;
	myScalar = cv::Scalar(0,255,0);
	cout<<"myScalar = "<<myScalar<<endl;
	system("pause");

 執行結果:


(2)讀取彩色影象畫素值

彩色影象的每個畫素對應三個部分:RGB三個通道。因此包含彩色影象的cv::Mat類會返回一個向量,向量中包含三個8位的數值。OpenCV為這樣的短向量定義了一種型別,即我們上述的cv::Vec3b。這個向量包含三個無符號字元(unsigned character)型別的資料。

OpenCV儲存通道次序為:藍色、綠色、紅色即BGR。
因此,訪問彩色畫素中元素的方法如下:

cv::Mat pImg = cv::imread("Lena.jpg",1);
	if(!pImg.data)
		return 0;
	int x = 100, y = 100;
	cv::Scalar pixel=pImg.at<Vec3b>(x,y);
	cout<<"B chanel of pixel is = "<<pixel.val[0]<<endl;
	cout<<"G chanel of pixel is = "<<pixel.val[1]<<endl;
	cout<<"R chanel of pixel is = "<<pixel.val[2]<<endl;
	system("pause");

 執行結果:

3. Point

3.1 基本概念

常用於表示2維座標(x,y)。

3.2 用法

(1)影象座標

對影象而言,我們可以這樣定義:

cv::Point pt;
pt.x = 10;
pt.y = 8;
或者
cv::Point pt =  Point(10, 8);

或者

cv::Point pt(10,8);

(2)或使用如下預定義:

typedef Point_<int> Point2i;
typedef Point2i Point;
typedef Point_<float> Point2f;
typedef Point_<double> Point2d;

(3)基本運算

pt1 = pt2 + pt3;
pt1 = pt2 - pt3;
pt1 = pt2 * a;
pt1 = a * pt2;
pt1 += pt2;
pt1 -= pt2;
pt1 *= a;
double value = norm(pt); // L2 norm
pt1 == pt2;
pt1 != pt2;

3.3 示例程式碼

(1)設定座標點

// Point
	cv::Point pt;
	pt.x = 278;
	pt.y = 269;
	//或者
	//cv::Point  pt (278,269);
	cv::Scalar pix = pImg.at<Vec3b>(pt);
	cout<<"pix("<<pt.x<<","<<pt.y<<") = "<<pix<<endl;

 執行結果:



(2)各類運算

cv::Point pt1(10,20);
	cv::Point pt2(2,3);
	cout<<"pt1     = "<<pt1<<endl;
	cout<<"pt2     = "<<pt2<<endl;
	cout<<"pt1+pt2 = "<<pt1+pt2<<endl;
	cout<<"pt1+=pt2= "<<(pt1+=pt2)<<endl;
	cout<<"pt1-pt2 = "<<pt1-pt2<<endl;
	cout<<"pt2*2   = "<<pt2*2<<endl;

 執行結果:


4. Size

4.1 基本概念

模板類Size可表示一幅影象或一個矩形的大小。它包含寬、高2個成員:width , height還有一個有用的面積函式area()。

4.2 用法

cv::Size size(int w, int h);
//或者
cv::Size size;
size.width = w;
size.height = h;

4.3 示例程式碼

// Size
	cv::Size size1(6,3);
	cv::Size size2;
	size2.width = 4;
	size2.height = 2;
	cv::Mat mat1(size1,CV_8UC1,cv::Scalar(0));
	cv::Mat mat2(size2,CV_8UC3,cv::Scalar(1,2,3));
	cout<<"mat1 = "<<endl<<mat1<<endl;
	cout<<endl<<"mat2 = "<<endl<<mat2<<endl;
	system("pause");

 執行結果:


5. Rect

5.1 基本概念

Rect是另一個用於定義2維矩形的模板類。它由兩個引數定義:

  • 矩形左上角座標: (x,y)
  • 矩形的寬和高: width, height

Rect可以用來定義影象的ROI區域。

5.2 用法

cv::Rect rect(x, y, width, height);

5.3 示例程式碼

// Rect
	cv::Mat pImg = imread("Lena.jpg",1);
	cv::Rect  rect(180,200,200,200);//(x,y)=(180,200),w=200,height=200
	cv::Mat  roi = cv::Mat(pImg, rect);
	cv::Mat  pImgRect = pImg.clone();
	cv::rectangle(pImgRect,rect,cv::Scalar(0,255,0),2);
	cv::imshow("original image with rectangle",pImgRect);
	cv::imshow("roi",roi);
	cv::waitKey();
執行結果:

6. RotatedRect

6.1 基本概念

最後一個基本資料類是一種特殊的矩形稱為RotatedRect。這個類通過中心點,寬度和高度和旋轉角度來表示一個旋轉的矩形。

6.2 用法

旋轉矩形類的建構函式:

RotatedRect(const Point2f& center, const Size2f& size, float angle);

引數:

  • center:中心點座標Point2f型別
  • size:矩形的寬度和高度,Size2f型別
  • angle:順時針方向的旋轉角度(單位°),float型別

6.3 示例程式碼

//RotatedRect
	cv::Point2f center(100,100);
	cv::Size2f size(100,50);
	float angle = 45;// try 10, 30, 45

	RotatedRect rRect(center, size,  angle);
	cv::Mat image(200,200,CV_8UC3,cv::Scalar(0));

	Point2f vertices[4];
	rRect.points(vertices);
	for (int i = 0; i < 4; i++)
		line(image, vertices[i], vertices[(i+1)%4], Scalar(0,255,0));

	Rect brect = rRect.boundingRect();
	rectangle(image, brect, Scalar(255,0,0));

	imshow("rectangles", image);
	waitKey(0);
執行結果:


angle = 10, 30, 45

相關推薦

OpenCV基本資料結構示例

OpenCV的基本資料結構及示例 OpenCV中強大的Mat型別大家已經比較熟悉了。這裡梳理一些在工程中其他經常用到的幾種基本資料型別。包括:          Vec          Scalar          Point          Size    

影象識別處理之Opencv——基本資料結構示例

OpenCV中強大的Mat型別大家已經比較熟悉了。這裡梳理一些在工程中其他經常用到的幾種基本資料型別。包括: Vec Scalar:顏色的表示

OpenCV 基本矩陣操作示例

OpenCV的基本矩陣操作與示例 OpenCV中的矩陣操作非常重要,本文總結了矩陣的建立、初始化以及基本矩陣操作,給出了示例程式碼,主要內容包括: 建立與初始化 矩陣加減法 矩陣乘法 矩陣轉置 矩陣求逆 矩陣非零元素個數 矩陣均值與標準差

OpenCV 基本矩陣操作示例

2.3 矩陣乘法 使用"*"號計算矩陣與標量相乘,矩陣與矩陣相乘(必須滿足矩陣相乘的行列數對應規則) Mat m1= Mat::eye(2,3, CV_32F); //使用cv名稱空間可省略cv::字首,下同 Mat m2= Mat::ones(3,2, CV_32F); cout<

資料結構演算法JavaScript描述讀書筆記(基本排序演算法)

前提準備 //自動生成陣列的函式,n:整數個數,數字在l-r之間 function setData(n,l,r){ var dataStore = []; for(var i=0;i<n;i++){ dataStore[i] = Math.floor(

資料結構一(資料結構演算法基本含義)

1.1 基礎概念 ● 資料元素       ● 是組成資料的,有一定意義的單位       ● 在計算機中通常作為整體處理       ● 也叫做結點或記

資料結構演算法】之樹的基本概念及常用操作的Java實現(二叉樹為例) --- 第十二篇

樹是一種非線性資料結構,這種資料結構要比線性資料結構複雜的多,因此分為三篇部落格進行講解: 第一篇:樹的基本概念及常用操作的Java實現(二叉樹為例) 第二篇:二叉查詢樹 第三篇:紅黑樹 本文目錄: 1、基本概念 1.1  什麼是樹 1.2  樹的

資料結構基本演算法

資料結構是計算機儲存、組織資料的方式。資料結構是指相互之間存在一種或多種特定關係的資料元素的集合。通常情況下,精心選擇的資料結構可以帶來更高的執行或者儲存效率。資料結構往往同高效的檢索演算法和索引技術有關,資料結構有以下幾種基本的結構演算法: 1.集合結構 集合結構中的資料元素同屬於一個集合,他們之間是並

資料結構演算法——基本概念術語

概述  資料、資料元素、資料物件 資料(data)是對客觀事物的符號表示,在電腦科學中是指所有能輸入到計算機中並被計算機程式處理的程式的總稱。 資料元素(data element)是資料的基本單位,在計算機程式中通常作為一個整體進行考慮和處理。一個數據元素可由若干個資料項(data ite

c++的基本資料型別儲存結構(學生筆記)

資料型別: 1.基本型別:整型(int,bool,enum),浮點型(float,double),字元型(char) 2.結構型別:陣列([ ]),結構(struct)聯合(union),類(class) 3.指標型別:(*) 4.空型別:(void) 整形根據示數範圍分為:短整形(sh

資料結構演算法設計》實驗報告書之二叉樹的基本操作實現及其應用

《資料結構與演算法設計》實驗報告書之二叉樹的基本操作實現及其應用 實驗專案 二叉樹的基本操作實現及其應用 實驗目的 1.熟悉二叉樹結點的結構和對二叉樹的基本操作。 2.掌握對二叉樹每一種操作的具體實現。 3.學會利用遞迴方法編寫對二叉樹這種遞迴資料結構進行處理的演算法。 4.會用二叉

資料結構演算法設計》實驗報告書之字串和陣列的基本操作

《資料結構與演算法設計》實驗報告書之字串和陣列的基本操作 實驗專案        字串和陣列的基本操作 實驗目的        1.掌握陣列的定

資料結構演算法15-圖的基本資料操作

基本資料操作 ADT  圖(Graph) Data        頂點的有窮非空集合和邊的集合 Operation           CreateGraph(*G,V,VR):V點集,VR邊弧集的定義構造圖G           DestroyGraph(*G)

資料結構演算法】一、基本

一、絮絮叨叨 計劃寫一系列資料結構與演算法的部落格: 一是給自己立個flag——堅持做完, 二是記錄自己的學習過程,總結和分享知識 1、Why? 面試 =》考查基礎 =》資料結構與演算法 工作 =》有助於理解、使用框架;優化程式,提升效率、效能 鍛鍊邏輯思

資料結構演算法】之單鏈表、雙鏈表、迴圈連結串列的基本介紹及其Java程式碼實現---第三篇

一、連結串列的基本介紹 連結串列的定義:連結串列是一種遞迴的資料結構,它或者為空(null),或者是指向一個結點(node)的引用,該結點含有一個泛型的元素和一個指向另一條連結串列的引用。----Algorithms  Fourth  Edition   常見的連結串

資料結構演算法】之棧的基本介紹及其陣列、連結串列實現---第四篇

一、棧的基本介紹 1、棧的基本概念 棧是一種限制在一端進行插入和刪除操作的線性表資料結構。棧中有兩個比較重要的操作:push(壓棧:將元素壓入棧頂)和pop(彈棧:從棧頂彈出一個元素)。都滿足先進後出、後進先出的特點! 從圖中可以看出,我們常把棧的上面稱為棧

資料結構演算法】之佇列的基本介紹及其陣列、連結串列實現---第五篇

一、佇列的基本概念 1、定義 佇列是一種先進先出的線性表。它只允許在表的前端進行刪除操作,而在表的後端進行插入操作,具有先進先出、後進後出的特點。進行插入操作的一端成為隊尾(tail),進行刪除操作的一端稱為隊頭(head)。當佇列中沒有元素時,則稱之為空佇列。 在

資料結構演算法】之遞迴的基本介紹---第六篇

一、遞迴的基本概念 1、定義 遞迴:指的是一個過程,函式直接或者間接的呼叫自己,此時則發生了遞迴。 遞迴的兩個要素:遞推公式和遞迴邊界 可以看到遞迴的定義非常的簡潔,但是理解起來就沒有這麼容易了。不知道大家是否和我一樣,在遇到遞迴問題的時候,總是試圖去一步一步的分

資料結構演算法:B樹(B-Tree)定義及搜尋、插入、刪除基本操作

B樹(B-Tree) 在介紹什麼是B樹(B-Tree)之前,先看看為什麼存在B樹結構? B樹(B-Tree)是為磁碟或者其他輔助儲存裝置而設計的一種平衡搜尋樹,如有的資料庫系統使用B樹或者B樹的變種來儲存資訊。B樹的節點可以有很多孩子,從數個到數千個,不同於一

大學生學程式設計(十):資料結構演算法的基本概念

為啥扯淡,因為我們開發人員很少用到它,目前流行的android開發有資料結構麼?沒有,至少你在用api的時候基本上是看不見的。c++有在STL基本容器中string, vector, list, deque, map等。人家都已經實現且以近完美,我們學它有啥用有必要嗎? 這個爭論由來已久