pythonopencv圓
『壹』 用python計算圓的面積
首先定義一個findArea()方法,參數r為圓的半徑,圓周率π取3.142,函數的返回值為PI * (r*r),然後調用該方法即可求出圓的面積。
Python解釋器易於擴展,可以使用C或C++(或者其他可以通過C調用的語言)擴展新的功能和數據類型。[4]Python 也可用於可定製化軟體中的擴展程序語言。Python豐富的標准庫,提供了適用於各個主要系統平台的源碼或機器碼。
2021年10月,語言流行指數的編譯器Tiobe將Python加冕為最受歡迎的編程語言,20年來首次將其置於Java、C和JavaScript之上。
由於Python語言的簡潔性、易讀性以及可擴展性,在國外用Python做科學計算的研究機構日益增多,一些知名大學已經採用Python來教授程序設計課程。例如卡耐基梅隆大學的編程基礎、麻省理工學院的計算機科學及編程導論就使用Python語言講授。
眾多開源的科學計算軟體包都提供了Python的調用介面,例如著名的計算機視覺庫OpenCV、三維可視化庫VTK、醫學圖像處理庫ITK。而Python專用的科學計算擴展庫就更多了。
『貳』 python使用opencv進行圓檢測的時候出現"Nonetype" object has no attribute "rint" 是什麼問題
這個提示的意思是None類型對象沒有rint屬性,也就是說,你宴逗散上一步操作後返回晌氏的是一個None值,而不是你在題目里說到的圓,所以才會有這個提示,你應該檢查一下上一步操作的結果。
如果上一步的返回結果是一個圓,那就是一個circle對象。你可以使用type方法檢測返回結果。
不知道我說清楚了沒有指拿,希望可以幫助到你。
『叄』 用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-Python教程:19.輪廓屬性
1圖像矩
幫你計算一些屬性,比如重心,面積等。
函數cv2.moments()會給你一個字典,包含所有矩值
你可以從這個裡面得到有用的數據比如面積,重心等。重心可以用下面的式子得到:
2.輪廓面積
輪廓面積由函數cv2.contourArea()得到或者從矩里得到M['m00']
3.輪廓周長
可以用cv2.arcLength()函數得到。第二個參數指定形狀是否是閉合的輪廓(如果傳True)。或者只是一個曲線。
4.輪廓近似
這會把輪廓形狀近似成別的邊數少的形狀,邊數由我們指定的精確度決定。這是Douglas-Peucker演算法的實現。
要理解這個,假設你試圖找一個圖像里的方塊,但是由於圖像里的一些問題,你得不到一個完美的方塊,只能得到一個「壞方塊」。現在你可以使用這個函數來近似,第二個參數叫epsilon,是從輪廓到近似輪廓的最大距離。是一個准確率參數,好的epsilon的選擇可以得到正確的輸出。
在下面第二個圖像里,綠線顯示了epsilon = 10% of arc length 的近似曲線。第三個圖像顯示了epsilon = 1% of the arc length。第三個參數指定曲線是否閉合。
5.凸形外殼
凸形外殼和輪廓近似類似,但是還不一樣(某些情況下兩個甚至提供了同樣的結果)。這兒,cv2.convexHull()函數檢查凸面曲線缺陷並修復它。一般來說,凸面曲線總是外凸的,至少是平的,如果它內凹了,這就叫凸面缺陷。比如下面這張圖,紅線顯示了手的凸形外殼。雙向箭頭顯示了凸面缺陷,是輪廓外殼的最大偏差。
參數詳情:
·points 是我們傳入的輪廓
·hull 是輸出,一般我們不用傳
·clockwise: 方向標示,如果是True,輸出凸形外殼是順時針方向的。否則,是逆時針的。
·returnPoints:默認是True。然後會返回外殼的點的坐標。如果為False,它會返回輪廓對應外殼點的索引。
所以要獲得凸形外殼,下面
但是如果你想找到凸面缺陷,你需要傳入returnPoints = False。我們拿上面的矩形圖形來說,首先我找到他的輪廓cnt,現在用returnPoints = True來找他的凸形外殼,我得到下面的值:[[[234 202]], [[51 202]], [51 79]], [[234 79]]] 是四個角的點。如果你用returnPoints = False,我會得到下面的結果:[[129], [67], [0], [142]]. 這是輪廓里對應點的索引,比如cnt[129] = [234, 202]],這和前面結果一樣。
6.檢查凸面
有一個函數用來檢查是否曲線是凸面, cv2.isContourConvex().它返回True或False。
7.邊界矩形
有兩種邊界矩形
7.a.正邊界矩形
這個矩形不考慮對象的旋轉,所以邊界矩形的面積不是最小的,函數是cv2.boundingRect()。
假設矩形左上角的坐標是(x,y), (w, h)是它的寬和高
7.b.渲染矩形
這個邊界矩形是用最小面積畫出來的,所以要考慮旋轉。函數是cv2.minAreaRect()。它返回一個Box2D結構,包含了(左上角(x,y),(width, height),旋轉角度)。但是要畫這個矩形我們需要4個角。這四個角用函數cv2.boxPoints()得到
8.最小閉包圓
我們找一個目標的外接圓可以用函數cv2.minEnclosingCircle().這個圓用最小面積完全包圍目標。
9.橢圓
用一個橢圓來匹配目標。它返回一個旋轉了的矩形的內接橢圓
10. 直線
類似的我們可以匹配一根直線,下面的圖像包含一系列的白色點,我們可以給它一條近似的直線。
END