日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

椭圆拟合

發布時間:2023/12/18 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 椭圆拟合 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

看了網上光宇橢圓擬合的各種算法,都差不多,但是寫的條理很亂,借鑒別人的成果,修改了下程序,下邊是我梳理后的過程。

#include "cv.h"
#include "highgui.h"
int main()
{ ? //定義圖像
IplImage *img3 = cvLoadImage("spot.JPG",0);
IplImage *img2 = cvCloneImage(img3);
//將原圖img3閾值化為img2;
cvThreshold(img3, img2, 50, 255, CV_THRESH_BINARY);
IplImage *img4 = cvCloneImage(img3);
cvNamedWindow("Source", 1);
cvNamedWindow("Result", 1);
cvShowImage("Source", img3);
//設置橢圓擬合用到的幾個參數
CvMemStorage *stor = cvCreateMemStorage(0);
CvSeq *cont = cvCreateSeq(CV_SEQ_ELTYPE_POINT, sizeof(CvSeq), sizeof(CvPoint), stor);
CvBox2D32f *box;
CvPoint *PointArray;
CvPoint2D32f *PointArray2D32f;
? ? //檢索橢圓的輪廓,存儲在stor
cvFindContours(img2, stor, &cont, sizeof(CvContour),
CV_RETR_LIST, CV_CHAIN_APPROX_NONE, cvPoint(0, 0));
//清空圖像img2,img4;
cvZero(img2);
cvZero(img4);
//繪制所有輪廓并用橢圓擬合
for (; cont; cont = cont->h_next)
{
int i;
int count = cont->total;//輪廓個數
CvPoint center;
CvSize size;
/*個數必須大于6,這是cvFitEllipse_32f的要求*/
if (count<6)
{
continue;
}
//分配內存給點集
PointArray = (CvPoint *)malloc(count*sizeof(CvPoint));
PointArray2D32f = (CvPoint2D32f*)malloc(count*sizeof(CvPoint2D32f));
//分配內存給橢圓數據
box = (CvBox2D32f *)malloc(sizeof(CvBox2D32f));
//得到點集(這個方法值得借鑒)
cvCvtSeqToArray(cont, PointArray, CV_WHOLE_SEQ);
//將CvPoint點集轉化為CvBox2D32f集合
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(img4, cont, CV_RGB(255, 255, 255), CV_RGB(255, 255, 255),
0, 1, 8, cvPoint(0, 0));
//將橢圓數據從浮點轉化為整數表示
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;
//畫橢圓
cvEllipse(img4, center, size, box->angle, 0, 360, CV_RGB(0, 0, 255), 1, CV_AA, 0);
free(PointArray);
free(PointArray2D32f);
free(box);
}
cvShowImage("Result", img4);
cvWaitKey(0);
cvSaveImage("1.JPG", img4);
cvReleaseImage(&img2);
cvReleaseImage(&img3);
cvDestroyWindow("Source");
cvDestroyWindow("Result");
return 0;
}




總結

以上是生活随笔為你收集整理的椭圆拟合的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。