opencv椭圆检测
2016-08-04 17:33
113 查看
原文地址:http://blog.csdn.net/henhen2002/article/details/4304674
运行环境 BCB 6.0~ 需要OPENCV 库支持
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* contours;
CvBox2D s;
char string1[22];
char string2[22];
IplImage* img = cvLoadImage( "Ellipse.jpg" );
IplImage* gray = cvCreateImage(cvGetSize(img), 8, 1 );
IplImage* gray1 = cvCreateImage(cvGetSize(img), 8, 1 );
cvCvtColor(img, gray, CV_BGR2GRAY );
cvThreshold( gray, gray1 ,30, 255, CV_THRESH_BINARY );
//图像二值化(这里按需要进行修改,椭圆应为高灰度值)
cvNamedWindow( "Ellipse", 1 );
cvShowImage("Ellipse",gray1);
cvSaveImage("Ellipse11.jpg",gray1);
cvFindContours( gray1, storage, &contours, sizeof(CvContour),
CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
s=cvFitEllipse2(contours);
s.angle=90-s.angle;//这个地方是OPENCV的一个BUG 角度要修正一下
//cvEllipse( img, cvPointFrom32f( s.center ),cvSize(s.size.width,s.size.height), s.angle,0, 360, CV_RGB(0,0,255), 1, 8, 0 );
cvEllipseBox(img,s, CV_RGB(0,0,255),3, 8 , 0 );//画椭圆框
cvNamedWindow( "Ellipse22", 1 );
cvShowImage("Ellipse22",img);//原图上显示椭圆框
cvSaveImage("Ellipse22.jpg",img);
itoa(s.size.width, string1, 10 );
itoa(s.size.height, string2, 10 );
strcat(string1,", ");
strcat(string1,string2);
ShowMessage( AnsiString(" 椭圆的长短轴分别为:") + string1 + AnsiString(" 像素 "));
此程序只能检测一个椭圆,如果要检测多个椭圆,要做如下修改~
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* contours;
CvBox2D s;
char string1[22];
char string2[22];
char string3[22];
char string4[222];
IplImage* img = cvLoadImage( "Ellipse.jpg" );
IplImage* gray = cvCreateImage(cvGetSize(img), 8, 1 );
IplImage* gray1 = cvCreateImage(cvGetSize(img), 8, 1 );
cvCvtColor(img, gray, CV_BGR2GRAY );
cvThreshold( gray, gray1 ,100, 255, CV_THRESH_BINARY );
cvNamedWindow( "Ellipse", 1 );
cvShowImage("Ellipse",gray1);
cvSaveImage("Ellipse11.jpg",gray1);
int i=cvFindContours( gray1, storage, &contours, sizeof(CvContour),
CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
itoa(i, string3, 10 );
for(CvSeq* c=contours; c!=NULL; c=c->h_next)
{
s=cvFitEllipse2(c);
s.angle=90-s.angle;
cvEllipseBox(img,s, CV_RGB(255,0,0),2, 8 , 0 );//画椭圆框
itoa(s.size.width, string1, 10 );
itoa(s.size.height, string2, 10 );
strcat(string1," ");
strcat(string1,string2);
strcat(string4,string1);
strcat(string4," | ");
}
cvNamedWindow( "Ellipse22", 1 );
cvShowImage("Ellipse22",img);//原图上显示椭圆框
cvSaveImage("Ellipse22.jpg",img);
ShowMessage( AnsiString(" 共找到椭圆 ") + string3 + AnsiString(" 个/n ")+
AnsiString("椭圆的长短轴分别为:") + string4 + AnsiString("像素 "));
运行环境 BCB 6.0~ 需要OPENCV 库支持
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* contours;
CvBox2D s;
char string1[22];
char string2[22];
IplImage* img = cvLoadImage( "Ellipse.jpg" );
IplImage* gray = cvCreateImage(cvGetSize(img), 8, 1 );
IplImage* gray1 = cvCreateImage(cvGetSize(img), 8, 1 );
cvCvtColor(img, gray, CV_BGR2GRAY );
cvThreshold( gray, gray1 ,30, 255, CV_THRESH_BINARY );
//图像二值化(这里按需要进行修改,椭圆应为高灰度值)
cvNamedWindow( "Ellipse", 1 );
cvShowImage("Ellipse",gray1);
cvSaveImage("Ellipse11.jpg",gray1);
cvFindContours( gray1, storage, &contours, sizeof(CvContour),
CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
s=cvFitEllipse2(contours);
s.angle=90-s.angle;//这个地方是OPENCV的一个BUG 角度要修正一下
//cvEllipse( img, cvPointFrom32f( s.center ),cvSize(s.size.width,s.size.height), s.angle,0, 360, CV_RGB(0,0,255), 1, 8, 0 );
cvEllipseBox(img,s, CV_RGB(0,0,255),3, 8 , 0 );//画椭圆框
cvNamedWindow( "Ellipse22", 1 );
cvShowImage("Ellipse22",img);//原图上显示椭圆框
cvSaveImage("Ellipse22.jpg",img);
itoa(s.size.width, string1, 10 );
itoa(s.size.height, string2, 10 );
strcat(string1,", ");
strcat(string1,string2);
ShowMessage( AnsiString(" 椭圆的长短轴分别为:") + string1 + AnsiString(" 像素 "));
此程序只能检测一个椭圆,如果要检测多个椭圆,要做如下修改~
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* contours;
CvBox2D s;
char string1[22];
char string2[22];
char string3[22];
char string4[222];
IplImage* img = cvLoadImage( "Ellipse.jpg" );
IplImage* gray = cvCreateImage(cvGetSize(img), 8, 1 );
IplImage* gray1 = cvCreateImage(cvGetSize(img), 8, 1 );
cvCvtColor(img, gray, CV_BGR2GRAY );
cvThreshold( gray, gray1 ,100, 255, CV_THRESH_BINARY );
cvNamedWindow( "Ellipse", 1 );
cvShowImage("Ellipse",gray1);
cvSaveImage("Ellipse11.jpg",gray1);
int i=cvFindContours( gray1, storage, &contours, sizeof(CvContour),
CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
itoa(i, string3, 10 );
for(CvSeq* c=contours; c!=NULL; c=c->h_next)
{
s=cvFitEllipse2(c);
s.angle=90-s.angle;
cvEllipseBox(img,s, CV_RGB(255,0,0),2, 8 , 0 );//画椭圆框
itoa(s.size.width, string1, 10 );
itoa(s.size.height, string2, 10 );
strcat(string1," ");
strcat(string1,string2);
strcat(string4,string1);
strcat(string4," | ");
}
cvNamedWindow( "Ellipse22", 1 );
cvShowImage("Ellipse22",img);//原图上显示椭圆框
cvSaveImage("Ellipse22.jpg",img);
ShowMessage( AnsiString(" 共找到椭圆 ") + string3 + AnsiString(" 个/n ")+
AnsiString("椭圆的长短轴分别为:") + string4 + AnsiString("像素 "));
相关文章推荐
- opencv轮廓检测并绘制椭圆
- opencv轮廓检测之椭圆检测-----算法篇(1)
- opencv轮廓检测之椭圆检测
- opencv轮廓检测之椭圆检测-----算法篇(12)--RANSAC
- video2lcd_opencv2在JZ2440上实现椭圆检测
- opencv椭圆肤色模型人脸检测
- Hough变换检测椭圆 附带matlab与opencv代码
- Opencv--20行代码实现椭圆检测
- 2017/03/14 海洋内波和另外关于opencv中的椭圆检测方法
- 学习OpenCV——肤色检测:椭圆模型 (&最大连通区域)
- opencv轮廓检测之椭圆检测-----算法篇(3)--Sobel
- opencv轮廓检测之椭圆检测-----算法篇(5)---LAPLACIAN算子
- opencv关于椭圆检测
- opencv轮廓检测之椭圆检测-----算法篇(6)--ACTIVE CONTOURS
- opencv轮廓检测之椭圆检测-----算法篇(9)--检测椭圆的其他算法
- opencv轮廓检测之椭圆检测-----算法篇(7)--Hough transform检测圆
- opencv轮廓检测之椭圆检测-----算法篇(10)--FindContours函数算法解释
- opencv 皮肤检测 椭圆模型+轮廓去噪
- opencv轮廓检测之椭圆检测-----算法篇(4)--Canny
- opencv轮廓检测之椭圆检测-----算法篇(11)--fitEllipse算法解释