opencv 椭圆检测识别并画出轮廓

合集下载

OPENCV实现的轮廓检测与处理

OPENCV实现的轮廓检测与处理

OPENCV实现的轮廓检测与处理OpenCV是一个开源的计算机视觉库,提供了许多图像处理和计算机视觉相关的算法和工具。

其中,轮廓检测与处理是OpenCV中一个重要的功能,用于检测图像中的物体轮廓并对其进行处理。

在OpenCV中,轮廓检测是通过对图像进行二值化处理,然后寻找轮廓的闭合边缘来实现的。

下面将介绍使用OpenCV实现轮廓检测与处理的具体步骤。

第一步是图像预处理,包括读取图像、灰度化和二值化。

在OpenCV 中,可以使用`cv2.imread(`函数读取图像,并使用`cv2.cvtColor(`函数将图像转换为灰度图像。

然后,可以使用`cv2.threshold(`函数进行图像二值化处理,将图像转换为黑白图像。

第二步是寻找轮廓。

在进行轮廓检测之前,需要对图像进行一些预处理,如边缘检测。

在OpenCV中,可以使用`cv2.Canny(`函数进行边缘检测。

然后,可以使用`cv2.findContours(`函数找到图像中的轮廓。

第三步是轮廓处理。

在OpenCV中,可以使用`cv2.drawContours(`函数绘制轮廓,在图像上显示出来。

还可以使用`cv2.boundingRect(`函数获得轮廓的边界矩形,并使用`cv2.rectangle(`函数在图像上绘制该矩形。

此外,还可以通过计算轮廓的面积、周长或凸包等属性来对轮廓进行进一步处理。

第四步是轮廓特征提取。

在OpenCV中,可以使用`cv2.moments(`函数计算轮廓的一些几何特征,如质心、面积、周长和方向。

还可以使用`cv2.approxPolyDP(`函数对轮廓进行多边形拟合,从而获取更加精确的轮廓。

第五步是轮廓匹配。

在OpenCV中,可以使用`cv2.matchShapes(`函数计算两个轮廓之间的相似度。

这在图像识别、形状匹配等方面非常有用。

最后,可以使用`cv2.imshow(`函数将处理后的图片显示出来,并使用`cv2.waitKey(`等函数控制图像窗口的显示与关闭。

opencv轮廓提取原理

opencv轮廓提取原理

opencv轮廓提取原理标题:OpenCV轮廓提取原理引言:OpenCV是一个开源的计算机视觉库,提供了丰富的图像处理和分析功能。

其中,轮廓提取是一项重要的技术,可以用于目标检测、图像分割等应用。

本文将介绍OpenCV中轮廓提取的原理及其应用。

一、什么是轮廓?轮廓是指图像中连续的边界线,可以用一系列的点来表示。

在图像处理中,轮廓是由边缘检测算法得到的。

边缘检测是一种识别图像中明暗变化的方法,常用的算法有Sobel、Canny等。

二、OpenCV中的轮廓提取方法OpenCV提供了多种轮廓提取的方法,其中最常用的是findContours 函数。

该函数可以根据二值化图像找到图像中的轮廓,并将其保存为一个轮廓向量。

三、轮廓提取的原理轮廓提取的基本原理是通过图像的边缘信息来确定物体的边界。

具体步骤如下:1. 图像预处理:首先,对原始图像进行预处理,包括灰度化、降噪、二值化等操作。

这一步的目的是将图像转换为二值图像,使得物体与背景能够更好地区分开来。

2. 边缘检测:利用边缘检测算法,如Sobel、Canny等,在二值化图像中找到物体的边缘。

边缘检测算法会计算图像中每个像素点的梯度值,梯度值较大的点被认为是边缘点。

3. 轮廓提取:根据边缘图像,使用findContours函数将边缘点连接起来,形成物体的轮廓。

findContours函数会返回一个轮廓向量,其中每个轮廓由一系列的点表示。

4. 轮廓处理:根据需要,可以对轮廓进行进一步的处理,如轮廓拟合、轮廓面积计算等。

这些处理可以用于物体检测、形状识别等应用。

四、轮廓提取的应用轮廓提取在计算机视觉和图像处理中有广泛的应用,包括但不限于以下几个方面:1. 目标检测:通过提取图像中物体的轮廓,可以实现目标检测。

例如,可以通过形状匹配的方法,在图像中找到与给定模板形状相似的物体。

2. 图像分割:轮廓提取可以用于图像分割,将图像中的不同物体分离开来。

例如,在医学图像中,可以通过轮廓提取将肿瘤与正常组织分割开来。

opencv轮廓提取原理

opencv轮廓提取原理

opencv轮廓提取原理OpenCV是一个用于图像处理和计算机视觉的开源库,拥有丰富的功能和算法。

其中之一就是轮廓提取,它可以帮助我们从图像中提取出物体的边界轮廓。

本文将介绍OpenCV轮廓提取的原理和实现方法。

在图像处理中,轮廓是物体边界的表示形式,它是由一系列连续的点构成的曲线。

轮廓提取的目的是找到图像中所有物体的轮廓,以便进行进一步的分析和处理。

OpenCV提供了一种基于边缘检测的方法来实现轮廓提取。

边缘检测是一种常用的图像处理技术,它可以帮助我们找到图像中明显的边缘。

OpenCV提供了一些边缘检测算法,如Canny边缘检测算法。

这些算法可以帮助我们找到图像中明显的边缘,并将其表示为二值图像,其中边缘像素的值为255,非边缘像素的值为0。

在进行轮廓提取之前,我们首先需要对图像进行预处理,以便提高后续边缘检测的效果。

预处理包括灰度化、滤波和二值化等步骤。

灰度化将彩色图像转换为灰度图像,滤波可以帮助我们去除图像中的噪声,而二值化则可以将灰度图像转换为二值图像。

一旦我们得到了二值图像,就可以使用OpenCV提供的findContours函数来进行轮廓提取。

该函数可以帮助我们找到二值图像中的所有轮廓,并将其表示为一系列的点集。

每个轮廓都是一个包含一系列点坐标的向量,我们可以通过遍历这些点来获取轮廓的每个像素位置。

在轮廓提取之后,我们可以对轮廓进行一些进一步的处理,如计算轮廓的面积、周长和中心点等。

OpenCV提供了一些函数来实现这些功能,如contourArea、arcLength和moments等。

除了基本的轮廓提取之外,OpenCV还提供了一些高级的轮廓处理算法,如轮廓逼近、轮廓拟合和轮廓匹配等。

这些算法可以帮助我们更精确地描述和分析物体的轮廓。

总结来说,OpenCV轮廓提取是一种基于边缘检测的方法,它可以帮助我们从图像中提取出物体的边界轮廓。

通过预处理和使用findContours函数,我们可以得到图像中所有物体的轮廓,并进行进一步的分析和处理。

opencv查找轮廓算法原理

opencv查找轮廓算法原理

opencv查找轮廓算法原理
OpenCV中的轮廓查找算法原理主要基于图像处理和计算机视觉技术。


下是该算法的基本步骤和原理:
1. 边缘检测:这是轮廓查找的第一步,通过使用如Canny边缘检测器等算法,找出图像中像素强度发生显著变化的区域,这些区域通常对应于物体的边缘。

2. 二值化:对于边缘检测后的图像,通常会进行二值化处理,即将像素点分为前景(物体)和背景两类。

这一步通常通过设定阈值实现,大于阈值的像素被视为前景,小于阈值的像素被视为背景。

3. 轮廓提取:在二值化后的图像中,通过寻找连续的像素点(即轮廓),可以识别出物体的轮廓。

这一步通常使用如findContours函数等算法实现。

4. 轮廓处理:在提取出轮廓后,可能还需要进行一些处理,如轮廓平滑、轮廓细化等,以优化轮廓的表示。

5. 轮廓分析:最后,通过对提取出的轮廓进行分析,可以得出有关物体形状、大小、位置等的信息。

这个过程通常用于图像识别、机器视觉、目标检测等领域。

通过OpenCV
等计算机视觉库,可以方便地实现这些算法,并利用它们从图像中提取有用的信息。

OpenCV轮廓检测的实现方法

OpenCV轮廓检测的实现方法

OpenCV轮廓检测的实现⽅法轮廓概述1. 轮廓可以简单认为成将连续的点(连着边界)连在⼀起的曲线,具有相同的颜⾊或者灰度。

轮廓在形状分析和物体的检测和识别中很有⽤。

2. 为了更加准确,要使⽤⼆值化图像。

在寻找轮廓之前,要进⾏阈值化处理或者 Canny 边界检测。

3. 查找轮廓的函数会修改原始图像。

如果你在找到轮廓之后还想使⽤原始图像的话,你应该将原始图像存储到其他变量中。

4. 在 OpenCV 中,查找轮廓就像在⿊⾊背景中超⽩⾊物体,要找的物体应该是⽩⾊⽽背景应该是⿊⾊。

轮廓检测的作⽤:1.可以检测图图像或者视频中物体的轮廓2.计算多边形边界,形状逼近和计算感兴趣区域先看⼀个较为简单的轮廓检测:import cv2import numpy as np# 创建⼀个200*200的⿊⾊空⽩图像img = np.zeros((200, 200), dtype=np.uint8)# 利⽤numpy数组在切⽚上赋值的功能放置⼀个⽩⾊⽅块img[50:150, 50:150] = 255# 对图像进⾏⼆值化操作# threshold(src, thresh, maxval, type, dst=None)# src是输⼊数组,thresh是阈值的具体值,maxval是type取THRESH_BINARY或者THRESH_BINARY_INV时的最⼤值# type有5种类型,这⾥取0: THRESH_BINARY ,当前点值⼤于阈值时,取maxval,也就是前⼀个参数,否则设为0# 该函数第⼀个返回值是阈值的值,第⼆个是阈值化后的图像ret, thresh = cv2.threshold(img, 127, 255, 0)# findContours()有三个参数:输⼊图像,层次类型和轮廓逼近⽅法# 该函数会修改原图像,建议使⽤img.copy()作为输⼊# 由函数返回的层次树很重要,cv2.RETR_TREE会得到图像中轮廓的整体层次结构,以此来建⽴轮廓之间的‘关系'。

Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)

Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)

Python基于opencv的简单图像轮廓形状识别(全⽹最简单最少代码)可以直接跳到最后整体代码看⼀看是不是很少的代码思路:1. 数据的整合2. 图⽚的灰度转化3. 图⽚的⼆值转化4. 图⽚的轮廓识别5. 得到图⽚的顶点数6. 依据顶点数判断图像形状⼀、原数据的展⽰图⽚⽂件共36个⽂件夹,每个⽂件夹有100张图⽚,共3600张图⽚。

每⼀个⽂件夹⾥都有形同此类的图形⼆、数据的整合对于多个⽂件夹,分析起来很不⽅便,所有决定将其都放在⼀个⽂件夹下进⾏分析,在python中具体实现如下:本次需要的包import cv2import osfrom PIL import Imageimport matplotlib.pyplot as pltimport numpy as npa=os.listdir('C:\\Users\\dell\\Desktop\\OpenCVProofSet')#循环读取每个⼦⽂件夹for i in range(len(a)):b=os.listdir('C:\\Users\\dell\\Desktop\\OpenCVProofSet\\'+a[i])#读取每个⼦⽂件下的图⽚⽂件for j in range(len(b)):c=Image.open('C:\\Users\\dell\\Desktop\\OpenCVProofSet\\'+a[i]+'\\'+b[j])#循环读取每个图⽚⽂件c.save('C:\\Users\\dell\\Desktop\\cleardata\\'+str(i)+'_'+str(j)+'.png')#以⽂件夹序号和图⽚序号为名保存在⼀个兴建⽂件夹下结果如下:三、图⽚轮廓的确定3.1图⽚的灰度处理以下以⼀张图⽚为例⼦作为说明对于灰度的处理,选择使⽤opencv的cv2.cvtColor函数,代码⽰例如下:d=os.listdir('C:\\Users\\dell\\Desktop\\cleardata\\')#⽂件路径e=cv2.imread('C:\\Users\\dell\\Desktop\\cleardata\\'+d[5])#以矩阵的形式图⽚读⼊plt.imshow(e)#画出⽰例图进⾏灰度的转化:g=cv2.cvtColor(e,cv2.COLOR_BGR2GRAY)##灰度转化3.2图⽚的⼆值转化对于图⽚的⼆值转化这⾥选⽤cv2.threshold函数,代码⽰例如下:r,b=cv2.threshold(g,0,255,cv2.THRESH_OTSU)#⼆值转化,⼤于0的像素统⼀设置为255,⼩于等于0的统⼀设置为0上述代码的第⼀个参数为灰度图形,第⼆个参数是阈值,即⼤于0的像素点转化为255,然后选⽤的THRESH_OTSU⽅法,具体说明如下:通常情况,我们⼀般不知道设定怎样的阈值thresh才能得到⽐较好的⼆值化效果,只能去试。

opencv中霍夫变换检测椭圆

opencv中霍夫变换检测椭圆

opencv中霍夫变换检测椭圆OpenCV 是一个开源的计算机视觉库,提供了许多强大的图像处理和分析工具。

其中之一就是霍夫变换,可以用来检测图像中的直线、圆和椭圆等形状。

本文将重点介绍如何使用霍夫变换来检测椭圆。

椭圆是一个具有对称性的二维曲线,一般用两个轴来描述其形状:长轴和短轴,通常用 a 和 b 表示。

根据椭圆的方程 `x^2/a^2 + y^2/b^2 = 1`,我们可以推导出其他相关参数,如椭圆的中心坐标和倾斜角度。

在开始检测椭圆之前,我们首先要导入必要的库和加载图像。

以下是一个示例代码:```pythonimport cv2import numpy as np# 读取图像image = cv2.imread('ellipse.jpg')# 将图像转换为灰度gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 对图像进行平滑处理blur = cv2.GaussianBlur(gray, (5, 5), 0)```接下来,我们要使用霍夫变换检测图像中的椭圆。

在 OpenCV 中,`cv2.HoughCircles()` 函数可以用来检测圆形,但不能直接用来检测椭圆。

不过,我们可以通过将椭圆转化为圆的方式来实现检测椭圆。

为了实现这一点,我们可以利用两个关键函数:`cv2.HoughLinesP()` 和 `cv2.ellipse()`。

首先,我们使用 `cv2.HoughLinesP()` 函数检测直线,然后根据这些直线的交点来估计椭圆的参数。

```python# 运行霍夫直线检测lines = cv2.HoughLinesP(blur, 1, np.pi/180, threshold=100, minLineLength=150, maxLineGap=30)# 创建椭圆检测器对象ellipse_detector = cv2.createLineSegmentDetector()# 使用 Hough 直线检测结果估计椭圆参数for line in lines:x1, y1, x2, y2 = line[0]ellipse_detector.detect(blur, lines)ellipses = ellipse_detector.detect(blur)```此时,我们已经成功地检测到了图像中的椭圆参数。

(4条消息)opencv轮廓检测之椭圆检测

(4条消息)opencv轮廓检测之椭圆检测

(4条消息)opencv轮廓检测之椭圆检测因为我是学机械出身, 机械行业最常见的零件就是回转件, 所以就先写个椭圆检测吧.
回转件大部分是圆形, 由于视角的关系, 圆形可能就变成了椭圆, 如何检测椭圆?
首先得二值化吧(canny threshold什么的)
然后findcontours
下一步应该用个什么算法, 判定哪些点是椭圆, 然而我暂时还不会, 所以就没有写, 估计一个月内能写出吧, 所以这一步就暂时用了约束条件, 一个是构成椭圆的最少点数, 一个是椭圆的长轴短轴要在一个范围内. 其实还可以再用面积约束一下, 这几个约束是糊弄人的, 我就没弄
下一步该干什么? 来个fitellipse~ 算法写的好, 可能都不用这样, 直接进行下一步
最后drawellipse 这就完成了
程序代码在github上传送门
---------------------------------------------------------------------------------------------------------------------------------
2016.4.11 20:00 代码更新传送门。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
int pointX = 0;
for (int i=0;i<19;i++)
{pointX=60*i+30;
cvEllipse(pImg,cvPoint(pointX,80),cvSize(19,20),-200,0,360,CV_RGB(255,255,255),-1,CV_AA,0);
}
IplImage* m_imageGray = cvCreateImage(cvSize(pImg->width,pImg->height),IPL_DEPTH_8U,1);
CvPoint2D32f pointXX;
float XXX,YYY;
for (int i = 0;i<19;i++)
{
pointX=60*i+60;
pointXX = GetCPoint(m_imageBw,pointX);
XXX=pointXX.x;
YYY=pointXX.y;
cout<<XXX<<" "<<YYY<<endl;
if (Value.val[0]!=0)
{
Xsum=Xsum+i;
Ysum=Ysum+j;
Sum++;
}
}
}
point.x=Xsum/Sum;
point.y=Ysum/Sum;
return point;
}
void FitEllipseBlob(IplImage* imageFg)
{
///////////*cvEllipse(m_CalibrateImageF,cvPoint(200,300),cvSize(10,11),-202.55482,0,360,CV_RGB(255,0,0),1,CV_AA,0);return;
{
PointArray2D32f[i].x=(float)PointArray[i].x;
PointArray2D32f[i].y=(float)PointArray[i].y;
}
//拟合当前轮廓
cvFitEllipse(PointArray2D32f,count,box);
//绘制当前轮廓
/*cvDrawContours(m_CalibrateImageF,cont,CV_RGB(0,255,0),CV_RGB(0,255,0),
box->angle = -box->angle;
XXXX=center.x;
YYYY=center.y;
cout<<XXXX<<" "<<YYYY<<endl;
free(PointArray);
free(PointArray2D32f);
free(box);
}
cvShowImage("Result",image04);
IplImage* m_imageBw = cvCreateImage(cvSize(pImg->width,pImg->height),IPL_DEPTH_8U,1);
cvCvtColor(pImg,m_imageGray,CV_RGB2GRAY);
cvThreshold(m_imageGray,m_imageBw,128,255,CV_THRESH_BINARY);
CvMemStorage *stor;
CvSeq *cont;
CvBox2D32f *box;
CvPoint *PointArray;
CvPoint2D32f *PointArray2D32f;
stor = cvCreateMemStorage(0);
cont = cvCreateSeq(CV_SEQ_ELTYPE_POINT,sizeof(CvSeq),sizeof(CvPoint),stor);
{
CvPoint2D32f point;
double Xsum=0,Ysum=0,Sum=0;
CvScalar Value;
for (int j=0;j<imageFg->height;j++)
{
for (int i= maxX-60;i<maxX;i++)
{
Value=cvGet2D(imageFg,j,i);
*#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
using namespace cv;
using namespace std; //标示符的可见范围
CvPoint2D32f GetCPoint(IplImage* imageFg,int maxX);
}
cout<<endl;
cout<<endl;
cout<<endl;
cout<<endl;
cout<<endl;
FitEllipseBlob(m_imageBw);
cvNamedWindow( "Image", 1 );//创建窗口
cvShowImage( "Image", m_imageBw );//显示图像
}
//分配内存给椭圆数据
box = (CvBox2D32f *)malloc(sizeof(CvBox2D32f));
//得到点集(这个方法值得借鉴)
cvCvtSeqToArray(cont,PointArray,CV_WHOLE_SEQ);
//将CvPoint点集转化为CvBox2D32f集合
for (i=0;i<count;i++)
0,1,8,cvPoint(0,0));*/
//将椭圆数据从浮点转化为整数表示
center.x = cvRound(box->center.x);
center.y = cvRound(box->center.y);
size.width = cvRound(box->size.width*0.5);
size.height = cvRound(box->size.height*0.5);
/////*cvSetImageROI(imageFg,BlobRect);
cvFindContours(imageFg,stor,&cont,sizeof(CvContour),
CV_RETR_LIST,CV_CHAIN_APPROX_NONE,cvPoint(0,0));
at XXXX,YYYY;
void FitEllipseBlob(IplImage* imageFg);
int main( int argc, char** argv )
{
IplImage* pImg; //声明IplImage指针
//载入图像
pImg = cvLoadImage( "C:\\Users\\BB\Desktop\\bec\\OPENCV椭圆拟合定位椭圆中心点以及重心法定位程序\\OPENCV椭圆拟合定位椭圆中心点以及重心法定位程序\\特征中心点提取误差分析\\image.bmp", 1);//[[此处的argc==2是否需要改成argc==1?我改了之后才能运行成功。求大牛解惑]] // wmzzzz :在"属性"|"debug"|里的command arguments里加入参数(一个路径:要打开的文件路径)这时argc==2就合理了...可以试试多加几个
// cvResetImageROI(imageFg);
//绘制所有轮廓并用椭圆拟合
for (;cont;cont = cont ->h_next)
{
int i;
int count= cont->total;//轮廓个数
CvPoint2D32f center;
CvSize size;
////*个数必须大于6,这是cvFitEllipse_32f的要求
cvSaveImage("image.bmp",pImg);
cvWaitKey(0); //等待按键
cvDestroyWindow( "Image" );//销毁窗口
cvReleaseImage( &pImg ); //释放图像
return 0;
}
CvPoint2D32f GetCPoint(IplImage* imageFg,int maxX)
if (count<6)
{
continue;
}
//分配内存给点集
PointArray = (CvPoint *)malloc(count*sizeof(CvPoint));
PointArray2D32f = (CvPoint2D32f*)malloc(count*sizeof(CvPoint2D32f));
相关文档
最新文档