资源简介
该方法采用提取图像轮廓,并进行最小二乘法计算拟合出圆。最后得出圆心和半径。
代码片段和文件信息
#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
相关资源
- Qt OpenCV 播放及Socket发送视频流
- 基于特征点匹配的三维重建OpenCV+Ope
- opencv3.4+contrib编译好的文件
- OpenCV2.4x中文参考手册
- opencv 精解
- 用4.3.2交叉编译好的opencv2.4.9所需依赖
- OpenCV2.3.1 win版安装包3
- 文本检测_opencv_DNN
- opencv-master.zip
- 基于OpenCV的智能视频监控系统设计源
- 基于 opencv 的车牌识别147642
- One cut in grabcut的OpenCV实现代码以及工
- opencv2.4.4库(.h/.lib/.dll)
- 摄像头实时监控与报警系统Opencv
- opencv在播放视频中画框框
- 学习OpenCV(中文版).pdf 高清版本
- 模板匹配算法实现
- Computer Vision with Opencv3 and Qt5.pdf
- 基于Opencv的手势识别147077
- 基于opencv的车辆检测
- opencv2.4.9 相机定标及图像矫正
- opencv2+vs2013实现表情识别 ,SVM+BP神经
- 基于opencv的三种人脸识别
- opencv求取多轮廓质心并在输出图像显
- 自己写的QT图像处理系统,和opencv进行
- OpenCV计算机视觉常用测试图
- 基于opencv颜色识别 - 图像(普通轮廓
- 基于OpenCV的车辆监测与计数
- 大华相机图像使用OpenCV显示
- opencv的单目标定API已经二次封装
评论
共有 条评论