OpenCV学习之椭圆曲线拟合
2017-08-04 16:18
537 查看
程序首先发现图像的轮廓,然后用椭圆逼近它。
//椭圆曲线拟合 #include "cv.h" #include "highgui.h" int slider_pos = 70; IplImage *image02 = 0, *image03 = 0, *image04 = 0; void process_image(int h); int main(int argc, char** argv) { // 读入图像,强制为灰度图像 image03 = cvLoadImage("corner.tif", 0); // Create the destination images image02 = cvCloneImage(image03); image04 = cvCloneImage(image03); // Create windows. cvNamedWindow("Source", 1); cvNamedWindow("Result", 1); // Show the image. cvShowImage("Source", image03); // Create toolbars. HighGUI use. cvCreateTrackbar("Threshold", "Result", &slider_pos, 255, process_image); process_image(0); // Wait for a key stroke; the same function arranges events processing cvWaitKey(0); cvReleaseImage(&image02); cvReleaseImage(&image03); cvDestroyWindow("Source"); cvDestroyWindow("Result"); return 0; } // Define trackbar callback functon. This function find contours, // draw it and approximate it by ellipses. void process_image(int h) { CvMemStorage* stor; CvSeq* cont; CvBox2D32f* box; CvPoint* PointArray; CvPoint2D32f* PointArray2D32f; // 创建动态结构序列 stor = cvCreateMemStorage(0); cont = cvCreateSeq(CV_SEQ_ELTYPE_POINT, sizeof(CvSeq), sizeof(CvPoint), stor); // 二值话图像. cvThreshold(image03, image02, slider_pos, 255, CV_THRESH_BINARY); // 寻找所有轮廓. cvFindContours(image02, stor, &cont, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_NONE, cvPoint(0, 0)); // Clear images. IPL use. cvZero(image02); cvZero(image04); // 本循环绘制所有轮廓并用椭圆拟合. for (; cont; cont = cont->h_next) { int i; // Indicator of cycle. int count = cont->total; // This is number point in contour CvPoint center; CvSize size; // Number point must be more than or equal to 6 (for cvFitEllipse_32f). if (count < 6) continue; // Alloc memory for contour point set. PointArray = (CvPoint*)malloc(count * sizeof(CvPoint)); PointArray2D32f = (CvPoint2D32f*)malloc(count * sizeof(CvPoint2D32f)); // Alloc memory for ellipse data. box = (CvBox2D32f*)malloc(sizeof(CvBox2D32f)); // Get contour point set. cvCvtSeqToArray(cont, PointArray, CV_WHOLE_SEQ); // Convert CvPoint set to CvBox2D32f set. for (i = 0; i<count; i++) { PointArray2D32f[i].x = (float)PointArray[i].x; PointArray2D32f[i].y = (float)PointArray[i].y; } //拟合当前轮廓. cvFitEllipse(PointArray2D32f, count, box); // 绘制当前轮廓. cvDrawContours(image04, cont, CV_RGB(255, 255, 255), CV_RGB(255, 255, 255), 0, 1, 8, cvPoint(0, 0)); // Convert ellipse data from float to integer representation. 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); box->angle = -box->angle; // Draw ellipse. cvEllipse(image04, center, size, box->angle, 0, 360, CV_RGB(0, 0, 255), 1, CV_AA, 0); // Free memory. free(PointArray); free(PointArray2D32f); free(box); } // Show image. HighGUI use. cvShowImage("Result", image04); }
相关文章推荐
- opencv学习——利用轮廓画矩阵、外接圆、拟合曲线
- OpenCV学习——椭圆拟合
- opencv学习心得九----椭圆拟合
- 【OpenCV学习】椭圆拟合
- 1.1.4-学习Opencv与MFC混合编程之---画图工具 画椭圆
- opencv 椭圆拟合
- OpenCV 学习(直线拟合)
- OpenCV 学习(直线拟合)
- 椭圆曲线拟合以及坐标扶正
- 1.1.3-学习Opencv与MFC混合编程之---画图工具 通过对话框进行工具的参数设置 画曲线 绘图校正
- machine learning week6 诊断机器学习算法的性能 各种学习曲线 来判断学习算法是过拟合或欠拟合
- 我的OpenCV学习笔记(19):检测轮廓,直线,圆以及直线拟合
- opencv 椭圆拟合
- opencv例程之椭圆拟合
- 1.1.4-学习Opencv与MFC混合编程之---画图工具 画椭圆
- 用学习曲线 learning curve 来判别过拟合问题
- OpenCv学习笔记(七)---OpenCv中的基本绘图函数,圆,椭圆,线段,矩形,多边形的绘制(1)
- (转)cocos2d-x学习笔记(三)让精灵按照自己设定的运动轨迹行动(曲线移动)。(以椭圆轨迹为例)
- opencv学习-imgprocess-计算轮廓的边界旋转box和椭圆
- 学习OpenCV——肤色检测:椭圆模型 (&最大连通区域)