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