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)可使用以下預定義的類型

  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. v1 = v2 + v3;
  7. cout<<"v2 = "<<v2<<endl;
  8. cout<<"v3 = "<<v3<<endl;
  9. cout<<"v1=v2+v3= "<<v1<<endl;
  10. cout<<"v1=v2*2 = "<<v2*2<<endl;
  11. cout<<"v1=-v2 = "<<-v2<<endl;
  12. cout<<"v1==v2 = "<<(v1==v2)<<endl;
  13. cout<<"v1!=v2 = "<<(v1!=v2)<<endl;
  14. 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結構

  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;
或者

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

或者

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?用法

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?用法

旋轉矩形類的構造函數:

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. RotatedRect rRect(center, size, angle);
  6. cv::Mat image(200,200,CV_8UC3,cv::Scalar(0));
  7. Point2f vertices[4];
  8. rRect.points(vertices);
  9. for (int i = 0; i < 4; i++)
  10. line(image, vertices[i], vertices[(i+1)%4], Scalar(0,255,0));
  11. Rect brect = rRect.boundingRect();
  12. rectangle(image, brect, Scalar(255,0,0));
  13. imshow("rectangles", image);
  14. waitKey(0);
運行結果:


angle = 10, 30, 45

轉載請注明出處(本文更新鏈接):http://blog.csdn.net/iracer/article/details/51292349

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458229.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458229.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458229.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用var聲明的變量 和 直接賦值并未聲明的變量的區別

在看JS高級程序設計時忽然想到這個問題&#xff0c;眾所周知&#xff0c;直接賦值一個變量而為聲明&#xff0c;會產生一個全局變量&#xff08;或者說是全局對象的屬性&#xff09;&#xff0c;但用var聲明的變量 和 直接賦值而并未聲明的變量 都有哪些區別呢&#xff0c;這是…

轉載-程序員編程技術迅速提高的終極攻略

2019獨角獸企業重金招聘Python工程師標準>>> 前言 你是否覺得自己從學校畢業的時候只做過小玩具一樣的程序&#xff1f;走入職場后哪怕沒有什么經驗也可以把以下這些課外練習走一遍&#xff08;朋友的抱怨&#xff1a;學校課程總是從理論出發&#xff0c;作業項目都…

工作記錄二-Docker+Dockerfile

1. 安裝虛擬機 Oracle VM VirtualBox&#xff0c; 安裝centos 7.2版本2. 需要在命令行中先設置代理&#xff1a; export http_proxyproxy.xxxxx.com:8080 3. 運行 yum install docker安裝docker 安裝 docker-compose curl -L https://github.com/docker/compose/releases/down…

SVM

from&#xff1a;https://blog.csdn.net/liugan528/article/details/79448379 SVM 1. 基本概念 支持向量機&#xff08;Support Vector Machine, SVM&#xff09;的基本模型是在特征空間上找到最佳的分離超平面使得訓練集上正負樣本間隔最大。SVM是用來解決二分類問題的有監督學…

listView當中有嵌套了有onClickListener的控件時ListView自身的onItemClick無響應的解決方案...

參考:http://www.cnblogs.com/bluestorm/archive/2013/03/24/2979557.html 解決方案 在ListView要顯示的Item的外層加上 android:descendantFocusability"blocksDescendants"轉載于:https://www.cnblogs.com/jinglecode/p/5683724.html

LoadRunner常用術語

1.場景 2.負載發生器 3.虛擬用戶 4.虛擬用戶腳本 5.事務 6.思考時間 7.集合點 8.事務響應時間 轉載于:https://www.cnblogs.com/Andy-Lv/p/5263707.html

跟我學Shiro目錄貼

2019獨角獸企業重金招聘Python工程師標準>>> http://jinnianshilongnian.iteye.com/blog/2018398 轉載于:https://my.oschina.net/zhanggongming/blog/714844

【WinForm-無邊框窗體】實現Panel移動窗體,沒有邊框的窗體

沒有邊框的窗體怎么移動&#xff1f;其實方法有很多&#xff0c;下面介紹一種用控件來移動窗體&#xff0c;Panel或PictureBox都可。主要設置控件的MouseDowm和MouseLeave事件。 第一步&#xff1a;窗體設計 窗體最上面是一個panel1 窗體最下面是一個Panel3&#xff0c;只顯示最…

\Grokking Algorithms\簡介與作者采訪

\關鍵點\這本書目的是告訴讀者解決問題的新方法。 \這本書試圖通過插圖來讓大家更容易掌握主題&#xff0c;避免部分讀者覺得太費解。 \這本書不僅適合沒有接觸過算法的人&#xff0c;也適合剛從計算機專業畢業的學生。 \這本書提供了非常多的例子和簡單練習。 \這并不是一本參…

ZedGraph使用經驗

開源的統計圖控件中基本常用的是OpenFlashChar和ZedGraph&#xff0c;今天就先來講講ZedGraph的使用。 ZedGraph資源 ZedGraph來源&#xff1a;http://sourceforge.net/project/showfiles.php?group_id114675ZedGraph相關例子資源&#xff1a;http://zedgraph.org/wiki/index.…

[轉載]聊一聊人員培養

轉載自“搜狗測試”微信。 人員培養的痛點 大家在組內人員培養是否遇到了如下問題&#xff1a; 組員成長緩慢&#xff0c;無法達到預期 有時候感覺組員沒啥進步&#xff0c;有時候感覺組員挺好的&#xff0c;無法統一評價 腦子里都是組員的問題&#xff0c;無法集中精力做其他…

QCon2016舊金山大會焦點分享者確認

QCon舊金山大會是由InfoQ舉辦的連續十年的最大的英語會議&#xff0c;它將在今年11月7-9日在舊金山灣區舉行。\\在QCon大會涵蓋了一系列深入的技術&#xff0c;架構師、資深開發者所關注的國際事件&#xff0c;聚焦創新領域和軟件發展趨勢&#xff0c;QCon大會每年在美國、中國…

怎樣安裝兩個tomcat,怎樣配置

裝兩個tomcat 各自是6.0和7.0 可想執行tomcat6.0 可是實際上卻執行tomcat7.0 兩個版本號都是用解壓縮包 事實上就是不能執行tomcat6.0 僅僅能執行7.0 兩個環境變量都配置了。port也改了 還是不行 我遇到這樣的情況了&#xff0c;不知大家遇到沒有&#xff0c;例如以下是我的…

機器學習實戰之SVM

一引言&#xff1a;支持向量機這部分確實很多&#xff0c;想要真正的去理解它&#xff0c;不僅僅知道理論&#xff0c;還要進行相關的代碼編寫和測試&#xff0c;二者想和結合&#xff0c;才能更好的幫助我們理解SVM這一非常優秀的分類算法支持向量機是一種二類分類算法&#x…

模擬分頁效果

css部分&#xff1a; <style type"text/css">.main{width:800px;zoom:1;margin:0 auto;}.item{width:800px;overflow:hidden;}ul{padding:0;width:860px;zoom:1;}.clear{zoom:1;}.clear:after{content:"";display:block;height:0;clear:both;visibil…

XML基本概念及增刪改查操作

一、概念及特征&#xff1a; 1. XML 指可擴展標記語言(Extensible Markup Language)&#xff0c;用戶可以自己定義標簽。XML 被設計用來傳輸和存儲數據&#xff0c;而 HTML 用于格式化并顯示數據&#xff0c;并且HTML不能自定義標簽。 2. XML 文檔形成一種樹結構&#xff0c; X…

mysql 時間類型 datetime,timestamp

2019獨角獸企業重金招聘Python工程師標準>>> CURRENT_TIMESTAMP 的 timestamp 意思是 根據 mysql 的當前時間&#xff0c;使用mysql 的當前時間。 參考地址&#xff1a;http://blog.sina.com.cn/s/blog_67cc6e7d0100nrwk.html datetime 和 timestamp 都是保存時間格…

生成jsp驗證碼的代碼詳解(servlet版)

package util; import java.util.*; import java.io.*; import java.awt.*; import java.awt.image.*; import javax.servlet.*; import javax.servlet.http.*; import com.sun.image.codec.jpeg.*; /** 生成驗證碼圖片*/ public class ValidateCode exten…

機器學習中的交叉驗證(cross-validation)

from:https://blog.csdn.net/lhx878619717/article/details/49079785 交叉驗證&#xff08;Cross validation)&#xff0c;交叉驗證用于防止模型過于復雜而引起的過擬合. 有時亦稱循環估計&#xff0c; 是一種統計學上將數據樣本切割成較小子集的實用方法。于是可以先在一個子…

linux禁止ping

執行此命令 &#xff1a;echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all 可以禁止ping一、如果沒有iptables禁止pingecho 1 > /proc/sys/net/ipv4/icmp_echo_igore_all #開啟echo 0 > /proc/sys/net/ipv4/icmp_echo_igore_all #關閉二、利用iptables規則禁pingi…