OpenCV—基本數據結構與示例

OpenCV的基本數據結構及示例



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

         Vec

         Scalar

         Point

         Size

         Rect

         RotatedRect


1. Vec


1.1 基本概念

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


1.2 用法


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

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

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

  1. myVector[0]=0;  

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

  1. typedef Vec<uchar, 2> Vec2b;  
  2. typedef Vec<uchar, 3> Vec3b;  
  3. typedef Vec<uchar, 4> Vec4b;  
  4. typedef Vec<short, 2> Vec2s;  
  5. typedef Vec<short, 3> Vec3s;  
  6. typedef Vec<short, 4> Vec4s;  
  7. typedef Vec<int, 2> Vec2i;  
  8. typedef Vec<int, 3> Vec3i;  
  9. typedef Vec<int, 4> Vec4i;  
  10. typedef Vec<float, 2> Vec2f;  
  11. typedef Vec<float, 3> Vec3f;  
  12. typedef Vec<float, 4> Vec4f;  
  13. typedef Vec<float, 6> Vec6f;  
  14. typedef Vec<double, 2> Vec2d;  
  15. typedef Vec<double, 3> Vec3d;  
  16. typedef Vec<double, 4> Vec4d;  
  17. typedef Vec<double, 6> Vec6d;  


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

  1. v1 = v2 + v3  
  2. v1 = v2 - v3  
  3. v1 = v2 * scale  
  4. v1 = scale * v2  
  5. v1 = -v2  
  6. v1 += v2  
  7. v1 == v2, v1 != v2  
  8. norm(v1) (euclidean norm)  

1.3 示例代碼


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

  1. // Vec  
  2.      cv::Vec<double, 8>  myVector;  
  3.      for(int i=0; i<myVector.rows;i++)  
  4.           myVector[i] = i;  
  5.      cout<<"myVector= "<<myVector<<endl;  
  6.      cout<<"myVector[0]= "<<myVector[0]<<endl;  
  7.      cout<<"myVector[3]= "<<myVector[3]<<endl;  
運行結果:

(2)基本運算

  1. cv::Vec<int, 6> v1,v2,v3;  
  2.         for(int i=0; i<v2.rows;i++){ //v2.rows返回向量v2的行數  
  3.                     v2[i] = i;  
  4.                     v3[i] = i+1;  
  5.              }  
  6.          
  7.         v1 = v2 + v3;  
  8.         cout<<"v2       = "<<v2<<endl;  
  9.         cout<<"v3       = "<<v3<<endl;  
  10.         cout<<"v1=v2+v3= "<<v1<<endl;  
  11.         cout<<"v1=v2*2  = "<<v2*2<<endl;  
  12.         cout<<"v1=-v2   = "<<-v2<<endl;  
  13.         cout<<"v1==v2   = "<<(v1==v2)<<endl;  
  14.         cout<<"v1!=v2   = "<<(v1!=v2)<<endl;  
  15.         cout<<"norm(v2)= "<<norm(v2)<<endl;  

運行結果:

2. Scalar

2.1 基本概念

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

2.2 用法

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

  1. cv:: Scalar( B, G, R )  

2.3 示例代碼

(1)cv::Scalar結構

  1. cv::Scalar myScalar;  
  2.     myScalar = cv::Scalar(0,255,0);  
  3.     cout<<"myScalar = "<<myScalar<<endl;  
  4.     system("pause");  

 運行結果:

(2)讀取彩色圖像像素值

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

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

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

 運行結果:

3. Point

3.1 基本概念

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

3.2 用法

(1)圖像座標

對圖像而言,我們可以這樣定義:

  1. cv::Point pt;  
  2. pt.x = 10;  
  3. pt.y = 8;  
或者

  1. cv::Point pt =  Point(10, 8);  

或者

  1. cv::Point pt(10,8);  

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

  1. typedef Point_<int> Point2i;  
  2. typedef Point2i Point;  
  3. typedef Point_<float> Point2f;  
  4. typedef Point_<double> Point2d;  

(3)基本運算

  1. pt1 = pt2 + pt3;  
  2. pt1 = pt2 - pt3;  
  3. pt1 = pt2 * a;  
  4. pt1 = a * pt2;  
  5. pt1 += pt2;  
  6. pt1 -= pt2;  
  7. pt1 *= a;  
  8. double value = norm(pt); // L2 norm  
  9. pt1 == pt2;  
  10. pt1 != pt2;  

3.3 示例代碼

(1)設置座標點

  1. // Point  
  2.     cv::Point pt;  
  3.     pt.x = 278;  
  4.     pt.y = 269;  
  5.     //或者  
  6.     //cv::Point  pt (278,269);  
  7.     cv::Scalar pix = pImg.at<Vec3b>(pt);  
  8.     cout<<"pix("<<pt.x<<","<<pt.y<<") = "<<pix<<endl;  

 運行結果:



(2)各類運算

  1. cv::Point pt1(10,20);  
  2.     cv::Point pt2(2,3);  
  3.     cout<<"pt1     = "<<pt1<<endl;  
  4.     cout<<"pt2     = "<<pt2<<endl;  
  5.     cout<<"pt1+pt2 = "<<pt1+pt2<<endl;  
  6.     cout<<"pt1+=pt2= "<<(pt1+=pt2)<<endl;  
  7.     cout<<"pt1-pt2 = "<<pt1-pt2<<endl;  
  8.     cout<<"pt2*2   = "<<pt2*2<<endl;  

 運行結果:

4. Size

4.1 基本概念

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

4.2 用法

  1. cv::Size size(int w, int h);  
  2. //或者  
  3. cv::Size size;  
  4. size.width = w;  
  5. size.height = h;  

4.3 示例代碼

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

 運行結果:

5. Rect

5.1 基本概念

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

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

Rect可以用來定義圖像的ROI區域。

5.2 用法

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

5.3 示例代碼

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

6. RotatedRect

6.1 基本概念

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

6.2 用法

旋轉矩形類的構造函數:

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

參數:

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

6.3 示例代碼

  1. //RotatedRect  
  2.     cv::Point2f center(100,100);  
  3.     cv::Size2f size(100,50);  
  4.     float angle = 45;// try 10, 30, 45  
  5.   
  6.     RotatedRect rRect(center, size,  angle);  
  7.     cv::Mat image(200,200,CV_8UC3,cv::Scalar(0));  
  8.   
  9.     Point2f vertices[4];  
  10.     rRect.points(vertices);  
  11.     for (int i = 0; i < 4; i++)  
  12.         line(image, vertices[i], vertices[(i+1)%4], Scalar(0,255,0));  
  13.   
  14.     Rect brect = rRect.boundingRect();  
  15.     rectangle(image, brect, Scalar(255,0,0));  
  16.   
  17.     imshow("rectangles", image);  
  18.     waitKey(0);  
運行結果:

angle = 10, 30, 45

//////////////////////////////////////////////////////////////////

 轉載:https://blog.csdn.net/iracer/article/details/51292349


發佈了46 篇原創文章 · 獲贊 88 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章