1. 程式人生 > >opencv3.0識別並提取圖形中的矩形

opencv3.0識別並提取圖形中的矩形

利用opencv來識別圖片中的矩形。 
其中遇到的問題主要是識別輪廓時矩形內部的形狀導致輪廓不閉合。 


1. 對輸入灰度圖片進行高斯濾波 
2. 做灰度直方圖,提取閾值,做二值化處理 
3. 提取圖片輪廓 
4. 識別圖片中的矩形 
5. 提取圖片中的矩形

1.對輸入灰度圖片進行高斯濾波

    cv::Mat src = cv::imread("F:\\t13.bmp",CV_BGR2GRAY);
    cv::Mat hsv;
    GaussianBlur(src,hsv,cv::Size(5,5),0,0);
2.做灰度直方圖,提取閾值,做二值化處理 
由於給定圖片,背景是黑色,矩形背景色為灰色,矩形中有些其他形狀為白色,可以參考為: 

提取輪廓時,矩形外部輪廓並未閉合。因此,我們需要對整幅圖做灰度直方圖,找到閾值,進行二值化

處理。即令畫素值(黑色)小於閾值的,設定為0(純黑色);令畫素值(灰色和白色)大於閾值的,設

置為255(白色)

  1. // Quantize the gray scale to 30 levels
  2. int gbins = 16;  
  3. int histSize[] = {gbins};  
  4.    // gray scale varies from 0 to 256
  5. float granges[] = {0,256};  
  6. constfloat* ranges[] = { granges };  
  7. cv::MatND hist;  
  8. // we compute the histogram from the 0-th and 1-st channels
  9. int channels[] = {0};  
  10. //calculate hist
  11. calcHist( &hsv, 1, channels, cv::Mat(), // do not use mask
  12.             hist, 1, histSize, ranges,  
  13.             true// the histogram is uniform
  14.             false );  
  15. //find the max value of hist
  16. double maxVal=0;  
  17. minMaxLoc(hist, 0, &maxVal, 0, 0);  
  18. int scale = 20;  
  19. cv::Mat histImg;  
  20. histImg.create(500,gbins*scale,CV_8UC3);  
  21. //show gray scale of hist image
  22. for(int g=0;g<gbins;g++){  
  23.     float binVal = hist.at<float>(g,0);  
  24.     int intensity = cvRound(binVal*255);  
  25.     rectangle( histImg, cv::Point(g*scale,0),  
  26.                        cv::Point((g+1)*scale - 1,binVal/maxVal*400),  
  27.                         CV_RGB(0,0,0),  
  28.                        CV_FILLED );  
  29. }  
  30. cv::imshow("histImg",histImg);  
  31. //threshold processing
  32. cv::Mat hsvRe;  
  33. threshold( hsv, hsvRe, 64, 255,cv::THRESH_BINARY);  

3.提取圖片輪廓 
為了識別圖片中的矩形,在識別之前還需要提取圖片的輪廓。在經過濾波、二值化處理後,輪廓提取後
的效果比未提取前的效果要好很多。


4.識別矩形 

識別矩形的條件為:圖片中識別的輪廓是一個凸邊形、有四個頂角、所有頂角的角度都為90度。

  1. vector<Point> approx;  
  2. for (size_t i = 0; i < contours.size(); i++)  
  3. {  
  4.     approxPolyDP(Mat(contours[i]), approx,   
  5.                  arcLength(Mat(contours[i]), true)*0.02, true);  
  6.     if (approx.size() == 4 &&  
  7.         fabs(contourArea(Mat(approx))) > 1000 &&  
  8.         isContourConvex(Mat(approx)))  
  9.     {  
  10.         double maxCosine = 0;  
  11.         forint j = 2; j < 5; j++ )  
  12.         {  
  13.             double cosine = fabs(angle(approx[j%4], approx[j-2], approx[j-1]));  
  14.             maxCosine = MAX(maxCosine, cosine);  
  15.         }  
  16.         if( maxCosine < 0.3 )  
  17.             squares.push_back(approx);  
  18.     }  
  19. }  

相關推薦

opencv3.0識別提取圖形矩形

利用opencv來識別圖片中的矩形。 其中遇到的問題主要是識別輪廓時矩形內部的形狀導致輪廓不閉合。 1. 對輸入灰度圖片進行高斯濾波 2. 做灰度直方圖,提取閾值,做二值化處理 3. 提取圖片輪廓 4. 識別圖片中的矩形 5. 提取圖片中的矩形1.對輸入灰度圖片進行高斯濾波 

Python 利用百度文字識別 API 識別提取圖片文字

Python 利用百度文字識別 API 識別並提取圖片中文字 利用百度 AI 開發平臺的 OCR 文字識別 API 識別並提取圖片中的文字。首先需註冊獲取 API 呼叫的 ID 和 key,步驟如下: 開啟百度AI開放平臺,進入控制檯中的文字識別應用(需要有百度賬號)。

opencv 讀取圖片提取Matdata資料

uchar* pImageData = (uchar*)malloc(width*height* 3 * sizeof(uchar));Mat MyImage = imread(file_name,IMREAD_COLOR);              if(!MyImage

基於OpenCV3.0的車牌識別系統設計(二)--車牌提取

寫在前面的話 上一篇開篇博文寫好之後找女朋友看了一下,希望她提一點建設性建議。結果她很委婉的告訴我,寫的還行就是太表面了,告訴我要注意細節的描述與具體的實現過程與原理等等。其實我只是想騙她看一下增加一下點選量,順便知道我寫的部落格新手能不能看懂而已。結果她告訴我,她那麼聰明當然能看懂,別人就

定義抽象類Shape,抽象方法為showArea(),求出面積顯示,定義矩形類Rectangle,正方形類Square,圓類 Circle,根據各自的屬性,用showArea方法求出各自的面積,在main方法構造3個對象,調用showArea方法。(體現多態)

子類 protected new 都是 package 使用 類指針 3.1 shape 實現多態的三個條件:1.要有繼承2.要有抽象方法重寫3.用父類指針(引用)指向子類對象 重載重寫重定義的區別: 1.重載:在同一個類中進行;  編譯時根據參數類型和個數決定方法調用; 

opencv3.0 vs2013配置的問題

read mas pre share ctu namespace window clas opencv3 問題: OpenCV Error: Assertion failed (size.width>0 && size.height>0) in

基於opencv3.0下的人臉識別識別部分的高斯模糊處理

根據 proc enter BE AS lur .com code 示例 如題 這裏將任務分解為三大部分: 1.錄播放視頻 2.人臉識別 3.部分高斯模糊 其中重點放在人臉識別和部分高斯模糊上 1.錄播放視頻(以opencv中的VideoCapture類進行實現) 首先羅

c++txt檔案的讀取以及在MFC讀取txt座標資料完成圖形繪製

主要介紹如何讀取txt檔案中的座標資料,並在MFC視窗中繪製出來,工程建立方法和繪圖方法與上一篇博文基本一致,這裡就不再詳贅述,可參考上一篇博文vs2010、MFC視窗中繪製點、線、面。 C++中讀取檔案的方法有兩種,一種是來自於C語言的“檔案指標”方法,另一種是C++中的“檔案流”思想。

js程式碼識別字符串的數字,返回數字

      有的時候我們經常需要從字串中提取數字,作為特殊的用途,對於一些沒有規律可循的字串來說,想要按照平常的方法提起數字會比較的繁瑣,因此使用正則表示式來識別字符串中的數字,程式碼如下: /** * 獲取字串中的數字 * @param str */ fun

基於OpenCV3.0的車牌識別系統設計(一)--系統綜述

寫在前面的話        車牌識別是影象處理技術的實際生活中一個非常重要的應用場景,目前車牌識別系統已經非常完善,識別準確率高達99%以上。作為學生,在學習影象處理時,自己搭建車牌識別系統是非常有價值的,作為入門專案有助於快速入門。並且在識

使用OCR文字識別軟體將圖文字識別提取出來的方法

  有時候我們上網看見了一些文字圖片,上面的內容自己很喜歡,想要將文字儲存下來,但是大家都知道圖片上面的文字是不可以直接進行復制貼上的,那這時候就需要識別提取圖中文字了,具體怎樣去操作呢?下面小編將在文字識別軟體中為大家講解下具體的操作方法。   使用工具:迅捷OCR文字識別軟體   步驟一、首先需要將文

如何通過迅捷OCR文字識別軟件識別提取文字

都是 設置 ges 工具 差異 等待 color 圖片 proc 工作中識別提取圖中文字的問題,也是時常會發生的,就比如說你的領導給了你一些圖片文件讓你將上面的文字錄入到文檔裏面,這時候你該不會傻傻的手動錄入吧,這種方法工作效率太低了,下面小編將教大家一種通過使用文字識別工

OpenCVMat和IplImage之間的相互裝換(OpenCV2.0OpenCV3.0

Mat是OpenCV和C++介面的矩陣類,IplImage是OpenCV和C語言介面的結構體。 Mat讀取顯示用的是imread、imshow等,IplImage讀取顯示用的是cvLoadImage()、cvShowImage()。 有時候會涉及到兩者之間的轉換,下面詳細見介紹一下兩者之

如何使用迅捷OCR文字識別軟體識別提取文字

  識別提取文字的問題相信是很多小夥伴都經歷過的,一般遇到這種問題,很多人都選擇了用電腦打字進行轉換,這種方法比較的耽誤時間,其實除了這種方法我們還有其它的選擇,就是通過藉助文字識別軟體識別提取圖片中的文字,具體怎樣去操作呢?一起來學習下。   使用工具:電腦        迅捷OCR文字識別軟體

如何使用迅捷OCR文字識別軟件識別提取文字

mar f11 block 選擇 http 進入 什麽 shadow 移動 識別提取文字的問題相信是很多小夥伴都經歷過的,一般遇到這種問題,很多人都選擇了用電腦打字進行轉換,這種方法比較的耽誤時間,其實除了這種方法我們還有其它的選擇,就是通過借助文字識別軟件識別提取圖片中的

jmeter介面效能測試(4)----提取json的資料應用到斷言中

介面資訊如下: 執行介面後在檢視結果樹種檢視響應資料,檢視方式選擇:JSON Path Tester 我們要在json中提取如下的資料: 檢視json體的路徑關係,在JSON path Expression中輸入路徑,關注是否能得到想要的數值。如:我們想要獲取上圖中的n

shell正則提取字串的數字儲存到變數

1.提取數字到變數 temp = `echo "helloworld20181212 | tr -cd "[0-9]""` echo ${temp} 2.釋義tr -cd "[0-9]"     tr是translate的縮寫,主要用於刪除檔案中的控制字元,或者進行字元轉換 &n

從鍵盤輸入4個0-13之間的正整數實現24點遊戲寫入檔案

程式碼如下: include<stdio.h> include <stdlib.h> include <time.h> FILE * fp; void main() { void play(); //宣告函式 fp=fopen

使用騰訊OCR識別提取圖片的文字

使用騰訊的OCR,官方文件上給出兩種方式,一種是自己寫請求,一種是使用騰訊整合的SDk,本次使用的是SDK,下載地址為:https://cloud.tencent.com/document/product/866/17600,根據需要選擇對應的SDK下載,本次以OCR-通用印

一套基於模板匹配的語音識別技術 提取語音的特征,建立模板庫 可以將語音識別技術應用於機器人

not bitblt switch uil terminal dia process ack context 視圖類,廢話少說,看看帶註釋的源碼 #include "stdafx.h" #include "robot.h" #include"Label.h