資源簡介
該方法采用提取圖像輪廓,并進(jìn)行最小二乘法計算擬合出圓。最后得出圓心和半徑。
代碼片段和文件信息
#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\li
?????文件????????5040??2018-07-08?10:16??最小二乘法求圓心和半徑\最小二乘法求圓心和半徑\Debug\li
?????文件?????????398??2018-07-08?10:16??最小二乘法求圓心和半徑\最小二乘法求圓心和半徑\Debug\li
?????文件??????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個文件信息
- 上一篇:畫法幾何及機械制圖 第四版
- 下一篇:仿照百度地圖搜索功能在線建議Demo
評論
共有 條評論