• 大小: 24.8MB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2023-06-22
  • 语言: 其他
  • 标签: Opencv  

资源简介

该方法采用提取图像轮廓,并进行最小二乘法计算拟合出圆。最后得出圆心和半径。

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 
#include 
#include 
using namespace cv;
using namespace std;

bool FilterMid(IplImage* &imageint k);

typedef struct Box
{
double x;
double y;
double r;
}Box;
 
Box circleLeastFit(const vector &points)
{
 
Box box;
box.x = 0.0f;
box.y = 0.0f;
box.r = 0.0f;
 
if (points.size()<3)
{
return box;
}
 
int i=0;
 
double X1=0;
double Y1=0;
double X2=0;
double Y2=0;
double X3=0;
double Y3=0;
double X1Y1=0;
double X1Y2=0;
double X2Y1=0;
 
int Sum=points.size();
for (i=0;i {
X1=X1+points[i]->x;
Y1=Y1+points[i]->y;
X2=X2+points[i]->x*points[i]->x;
Y2=Y2+points[i]->y*points[i]->y;
X3=X3+points[i]->x*points[i]->x*points[i]->x;
Y3=Y3+points[i]->y*points[i]->y*points[i]->y;
X1Y1=X1Y1+points[i]->x*points[i]->y;
X1Y2=X1Y2+points[i]->x*points[i]->y*points[i]->y;
X2Y1=X2Y1+points[i]->x*points[i]->x*points[i]->y;
}
 
double CDEGHN;
double abc;
N=points.size();
C=N*X2 - X1*X1;
D=N*X1Y1 - X1*Y1;
E=N*X3 + N*X1Y2 - (X2+Y2)*X1;
G=N*Y2 - Y1*Y1;
H=N*X2Y1 + N*Y3 - (X2+Y2)*Y1;
a=(H*D-E*G)/(C*G-D*D);
b=(H*C-E*D)/(D*D-G*C);
c=-(a*X1 + b*Y1 + X2 + Y2)/N;
 
double ABR;
A=a/(-2);
B=b/(-2);
R=sqrt(a*a+b*b-4*c)/2;
 
box.x=A;
box.y=B;
box.r=R;

return box;
}
int main()

IplImage *img=0;
int heightwidthstepchannels;
uchar *data;
img=cvLoadImage(“Circle.bmp“0);
IplImage *src=cvCloneImage(img);
if(!img)
{
printf(“fail to open“);
}
height=img->height;
width=img->width;
step=img->widthStep;
channels=img->nChannels;
data=(uchar*)img->imageData;
printf(“processing a %dx%d image with %d channels\n“heightwidthchannels);
cvNamedWindow(“原图“CV_WINDOW_AUTOSIZE);
cvNamedWindow(“滤波图“CV_WINDOW_AUTOSIZE);
    FilterMid( img8);
cvShowImage(“滤波图“img);
cvShowImage(“原图“src);

IplImage *gray_image = cvCreateImage(cvGetSize(img)81);
IplImage *rgb_image = cvCreateImage(cvGetSize(img)83);
cvZero(gray_image);
cvZero(rgb_image);
 
gray_image=cvCloneImage(img);
cvCvtColor(gray_imagergb_imageCV_GRAY2BGR);

 
CvMemStorage *storage = cvCreateMemStorage(0);
CvSeq *first_contours = NULL*temp_contours = NULL;

//int thresh=80;
//IplImage *canny_image = 0;

//cvCanny(gray_imagecanny_imagethreshthresh*23);
int n = cvFindContours(gray_imagestorage&first_contourssizeof(CvContour) CV_RETR_LIST CV_CHAIN_APPROX_SIMPLE);
//int n = cvFindContours(gray_imagestorage&first_contourssizeof(CvContour) CV_RETR_EXTERNALCV_CHAIN_APPROX_SIMPLE);
printf(“n=%d\n“n);
temp_contours=first_contours;

for (;temp_contours!=NULL;temp_contours=temp_contours->h_next)
{
vectorpt_vec;
CvPoint *pt;
cvDrawContours(rgb_imagetemp_contoursCV_RGB(00255)CV_RGB(00255)02CV_FILLEDcv

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2018-07-08 10:17  最小二乘法求圆心和半径\
     目录           0  2018-07-08 10:17  最小二乘法求圆心和半径\Debug\
     文件       54272  2018-07-08 10:16  最小二乘法求圆心和半径\Debug\最小二乘法求圆心和半径.exe
     文件      536632  2018-07-08 10:16  最小二乘法求圆心和半径\Debug\最小二乘法求圆心和半径.ilk
     文件     1518592  2018-07-08 10:16  最小二乘法求圆心和半径\Debug\最小二乘法求圆心和半径.pdb
     目录           0  2018-07-08 10:17  最小二乘法求圆心和半径\ipch\
     目录           0  2018-07-08 10:17  最小二乘法求圆心和半径\ipch\最小二乘法求圆心和半径-1d1051d3\
     文件    56754176  2018-07-08 10:17  最小二乘法求圆心和半径\ipch\最小二乘法求圆心和半径-1d1051d3\最小二乘法求圆心和半径-cbdd3d9.ipch
     文件         966  2018-07-08 09:27  最小二乘法求圆心和半径\最小二乘法求圆心和半径.sln
     文件    13324288  2018-07-08 10:18  最小二乘法求圆心和半径\最小二乘法求圆心和半径.sdf
     目录           0  2018-07-08 10:17  最小二乘法求圆心和半径\最小二乘法求圆心和半径\
     文件     1148754  2018-07-06 14:16  最小二乘法求圆心和半径\最小二乘法求圆心和半径\Circle.bmp
     目录           0  2018-07-08 10:17  最小二乘法求圆心和半径\最小二乘法求圆心和半径\Debug\
     文件       10276  2018-07-08 10:16  最小二乘法求圆心和半径\最小二乘法求圆心和半径\Debug\CL.read.1.tlog
     文件         322  2018-07-08 10:16  最小二乘法求圆心和半径\最小二乘法求圆心和半径\Debug\CL.write.1.tlog
     文件         646  2018-07-08 10:16  最小二乘法求圆心和半径\最小二乘法求圆心和半径\Debug\cl.command.1.tlog
     文件        2826  2018-07-08 10:16  最小二乘法求圆心和半径\最小二乘法求圆心和半径\Debug\link.command.1.tlog
     文件        5040  2018-07-08 10:16  最小二乘法求圆心和半径\最小二乘法求圆心和半径\Debug\link.read.1.tlog
     文件         398  2018-07-08 10:16  最小二乘法求圆心和半径\最小二乘法求圆心和半径\Debug\link.write.1.tlog
     文件      478208  2018-07-08 10:16  最小二乘法求圆心和半径\最小二乘法求圆心和半径\Debug\vc100.idb
     文件      995328  2018-07-08 10:16  最小二乘法求圆心和半径\最小二乘法求圆心和半径\Debug\vc100.pdb
     文件      173393  2018-07-08 10:16  最小二乘法求圆心和半径\最小二乘法求圆心和半径\Debug\最小二乘法求圆心.obj
     文件          77  2018-07-08 10:16  最小二乘法求圆心和半径\最小二乘法求圆心和半径\Debug\最小二乘法求圆心和半径.lastbuildstate
     文件        3578  2018-07-08 10:16  最小二乘法求圆心和半径\最小二乘法求圆心和半径\Debug\最小二乘法求圆心和半径.log
     文件           0  2018-07-08 09:34  最小二乘法求圆心和半径\最小二乘法求圆心和半径\Debug\最小二乘法求圆心和半径.write.1.tlog
     文件        4427  2018-07-08 10:16  最小二乘法求圆心和半径\最小二乘法求圆心和半径\最小二乘法求圆心.cpp
     文件        4011  2018-07-08 09:34  最小二乘法求圆心和半径\最小二乘法求圆心和半径\最小二乘法求圆心和半径.vcxproj
     文件         962  2018-07-08 09:34  最小二乘法求圆心和半径\最小二乘法求圆心和半径\最小二乘法求圆心和半径.vcxproj.filters
     文件         143  2018-07-08 09:27  最小二乘法求圆心和半径\最小二乘法求圆心和半径\最小二乘法求圆心和半径.vcxproj.user
     文件       10752  2018-07-08 10:17  最小二乘法求圆心和半径\最小二乘法求圆心和半径.suo
     目录           0  2018-07-08 10:06  最小二乘法求圆心和半径\ipch\最小二乘法求圆心和半径-5cc1797e\
............此处省略1个文件信息

评论

共有 条评论