pythonopencv圓形檢測
❶ opencv代碼詳解(探測紅色圓形 並標注)
CvSize//定義640*480大小區域
CvCapture//從攝像頭中獲取視頻
if(!capture)//如果獲取失敗
fprintf//輸出錯誤信息
getchar();//獲取一個輸入字猜啟符
return-1;//返回-1
cvNamedWindow//命名一個窗口,原始大小
CvScalar//定義2個數組
IplImage//新建2幅圖像,大小為640*480,一穗搏如幅3通銀碼道彩色,一幅灰度
while(1)//循環
IplImage*frame//獲取攝像頭的一幀畫面
if條件語句同上
cvCvtColorCV_BGR2HSV獲取的圖像由BGR模式轉換為HSV顏色模式
cvInRangeS檢測轉換後HSV圖像灰度是否在定義的2個數組范圍內
❷ OpenCv判斷某個輪廓是否為圓[100分]
方法1:現有輪廓擬合虧枝一個圓,計算擬合標旅啟准圓與現有輪廓的距離。
方法2:直接拆空如給定標准輪廓,計算輪廓距離。
僅供參考
❸ python OpenCV 霍夫(Hough Transform)直線變換檢測原理,圖像處理第 33 篇博客
霍夫變換(Hough Transform)是圖像處理領域中,從圖像中識別幾何形狀的基本方法之一。主要識別具有某些相同特徵的幾何形狀,例如直線,圓形,本篇博客的目標就是從黑白圖像中識別出直線。
翻閱霍夫直線變換的原理時候,橡皮擦覺得原理部分需要先略過,否則很容易在這個地方陷進去,但是問題來了,這個原理略過了,直接應用函數,裡面有些參數竟然看不懂。例如極坐標,角度掃描范圍,這種函數就屬於繞不過去的知識點了,所以本文轉移方向,死磕原理,下面的博文將語無倫次的為你展示如何學習原理知識。
因為數學知識的貧乏,所以在學習階段會涉及到很多基礎概念的學習,一起來吧。
首先找到相對官方的資料,打開該 地址
下面是一個數學小白對原理的學習經驗。
教材說:眾所周知,一條直線在圖像二維空間可由兩個變數表示。
抱歉,小白還真不知道……即使學習過,這些年也早已經還給老師了。
一開始難道要學習笛卡爾坐標系,不,你低估小白的能力了,我第一個查詢的是 θ 讀作 西塔 ,是一個希臘字母。
什麼是笛卡爾坐標系?
這個比較簡單,直角坐標系。
斜率和截距
斜率,亦稱「角系數」,表示一條直線相對於橫坐標軸的傾斜程度。
一條直線與某平面直角坐標系橫坐標軸正半軸方向的夾角的正切值即該直線相對於該坐標系的斜率。
如果直線與 x 軸互相垂直,直角的正切直無窮大,故此直線不存在斜率。
對於一次函數 y=kx+b , k 就是該函數圖像的斜率。
在學習的時候,也學到如下內容:
截距:對 x 的截距就是 y=0 時, x 的值,對 y 的截距就是 x=0 時, y 的值,
截距就是直線與坐標軸的交點的橫(縱)坐標。 x 截距為 a , y 截距 b ,截距式就是: x/a+y/b=1(a≠0且b≠0) 。
斜率:對於任意函數上任意一點,其斜率等於其切線與 x 軸正方向所成的角,即 k=tanα 。 ax+by+c=0中,k=-a/b 。
什麼是極坐標系?
關於極坐標系,打開 網路 學習一下即可。
重點學到下面這個結論就行:
找資料的時候,發現一個解釋的比較清楚的 博客 ,後續可以繼續學習使用。
繼續閱讀資料,看到如下所示的圖,這個圖也出現在了很多解釋原理的博客裡面,但是圖下面寫了一句話
在這里直接蒙掉了,怎麼就表示成極坐標系了?上面這個公式依舊是笛卡爾坐標系表示直線的方式呀,只是把 k 和 b 的值給替換掉了。
為何是這樣的,具體原因可以參照下圖。
<center>chou 圖</center>
繼續尋找關於霍夫變換的資料,找到一個新的概念 霍夫空間 。
在笛卡爾坐標系中,一條直線可以用公式 表示,其中 k 和 b 是參數,表示的是斜率和截距。
接下來將方程改寫為 ,這時就建立了一個基於 k - b 的笛卡爾坐標系。
此時這個新的方程在 k - b 坐標系也有一個新的直線。
你可以在紙上畫出這兩個方程對應的線和點,如下圖所示即可。
<center>chou 圖</center>
新的 k - b 坐標系就叫做霍夫空間,這時得到一個結論,圖像空間 x - y 中的點 對應了 霍夫空間 k - b 中的一條直線 ,即圖像空間的點與霍夫空間的直線發生了對應關系。
如果在圖像空間 x - y 中在增加一個點 ,那相應的該點在霍夫空間也會產生相同的點與線的對應關系,並且 A 點與 B 點產生的直線會在霍夫空間相交於一個點。而這個點的坐標值 就是直線 AB 的參數。
如果到這里你掌握了,這個性質就為我們解決直線檢測提供了方法,只需要把圖像空間的直線對應到霍夫空間的點,然後統計交點就可以達到目的,例如圖像空間中有 3 條直線,那對應到霍夫空間就會有 3 個峰值點。
遍歷圖像空間中的所有點,將點轉換到霍夫空間,形成大量直線,然後統計出直線交會的點,每個點的坐標都是圖像空間直線方程參數,這時就能得到圖像空間的直線了。
上述的內容沒有問題,但是存在一種情況是,當直線趨近於垂直時,斜率 k 會趨近於無窮大,這時就沒有辦法轉換了,解決辦法是使用法線來表示直線。
上文提及的斜截式如下:
通過第二個公式,可以得到下述公式:
此時,我們可以帶入一些數值進行轉換。
圖像空間有如下的幾個點:
轉換後的函數,都可以在霍夫空間 θ - ρ (橫坐標是 θ ,縱坐標是 ρ )進行表示。
原理這時就比較清晰了:
除了一些數學知識以外,經典的博客我們也有必要記錄一下,方便後面學習的時候,進行復盤。
本部分用於記錄本文中提及的相關數學原理,後續還要逐步埋坑。
今天涉及了一點點數學知識,能力限制,大家一起學習,有錯誤的地方,可以在評論區指出,不勝感激。
希望今天的 1 個小時(今天內容有點多,不一定可以看完),你有所收獲,我們下篇博客見~
相關閱讀
技術專欄
逗趣程序員
❹ opencv中檢測圓的方法
我採集了一幅JPG圖片,想檢測裡面的圓,樓主有簡單的常式么,我想學一學。
❺ python使用opencv進行圓檢測的時候出現"Nonetype" object has no attribute "rint" 是什麼問題
這個提示的意思是None類型對象沒有rint屬性,也就是說,你宴逗散上一步操作後返回晌氏的是一個None值,而不是你在題目里說到的圓,所以才會有這個提示,你應該檢查一下上一步操作的結果。
如果上一步的返回結果是一個圓,那就是一個circle對象。你可以使用type方法檢測返回結果。
不知道我說清楚了沒有指拿,希望可以幫助到你。
❻ 用android opencv判斷圓形
先進行邊緣提取,比如用cvCanny, 然後用Hough變換,但是opencv的hough圓檢測,不洞唯是太實用,罩笑和參數設置關系很大,很難檢測出所有的圓信息, 最好根據具體納悶培問題,自己編寫該模塊
❼ 用opencv函數HoughCircles為什麼檢測不到圓
//圓形檢測代碼demo
//載入數張包含各種形凱謹狀的圖片,檢測出其中的圓形
#include "cv.h"
#include "highgui.h"
#include <math.h>
#include <string.h>
#include <iostream>
int thresh = 50;
IplImage* img =NULL;
IplImage* img0 = NULL;
IplImage * pImg8u=NULL;
CvMemStorage* storage =NULL;
const char * wndname = "圓形檢測 Demo";
char* names[] = { "aa.png","bb.png","pic8.png"塵磨,"pic7.png","pic3.png","pic9.png","pic10.png",
"pic11.png","pic12.png","pic13.png","pic14.png",0};
void HoughCircle()
{
CvSeq * circles=NULL;
pImg8u=cvCreateImage(cvGetSize(img),8,1);
CvMemStorage* storage = cvCreateMemStorage(0);
cvCvtColor(img,pImg8u,CV_BGR2GRAY);
//最好先cvSmooth一下,再調用cvHoughCircles
cvSmooth(pImg8u,pImg8u,CV_GAUSSIAN,7,7);
circles=cvHoughCircles(pImg8u,storage,CV_HOUGH_GRADIENT,
2, //最小解析度,應當>=1
pImg8u->height/4, //該參數是讓演算法能明顯區分的兩個不同圓之間的最小距離
140, //用於Canny的邊緣閥值上限,下派孫斗限被置為上限的一半
118, //累加器的閥值
2, //最小圓半徑
120 //最大圓半徑
);
int k;
for (k=0;k<circles->total;k++)
{
float *p=(float*)cvGetSeqElem(circles,k);
//cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), 3, CV_RGB(0,255,0), -1, 8, 0 );
cvCircle(img,cvPoint(cvRound(p[0]),cvRound(p[1])),cvRound(p[2]),CV_RGB(0,0,0),3,CV_AA,0);
}
cvClearMemStorage( storage );
}
int main(int argc, char** argv)
{
int i, c;
// create memory storage that will contain all the dynamic data
for( i = 0; names[i] != 0; i++ )
{
img0 = cvLoadImage( names[i], 1 );
if( !img0 )
{
cout<<"不能載入"<<names[i]<<"繼續下一張圖片"<<endl;
continue;
}
img = cvCloneImage( img0 );
HoughCircle();
cvNamedWindow( wndname, 1 );
cvShowImage(wndname,img);
c = cvWaitKey(0);
cvReleaseImage( &img );
cvReleaseImage( &img0 );
cvReleaseImage(&pImg8u);
if( (char)c == 27 )
break;
}
cvDestroyWindow( wndname );
return 0;
}
❽ 在opencv中使用cvHoughCircles檢測圓,提到這是一種改進的方法,請問這種「改進的方法」改進的地方是哪裡
單納御純的hough變兆旅換檢測速度太慢,特別是園,是一到多映射,因而計算量急劇增大,需佔用大量內存空間,改進的方法很多,你可以看它洞猜岩的源代碼。個人估計用的是隨機Hough變換(RHT)