2009年7月14日 星期二

HW6-6

宣告所需物件
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include "stdio.h"
#include "iostream"

int main()
{
IplImage* img = 0;
IplImage * pImage = NULL; //宣告一個空間
IplImage * pImg8u = NULL; //宣告一個空間
CvMemStorage * storage = NULL;//宣告一空間來儲存測到的線段
CvSeq * circles = NULL;

img=cvLoadImage("123.jpg");//將圖片讀入img
pImage = cvCloneImage(img);
pImg8u = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U,1);

//轉成灰階圖像
if(img->nChannels != 1)
cvCvtColor(pImage,pImg8u,CV_BGR2GRAY);
else
cvCopy(pImage,pImg8u);

//將圖片平滑化
cvSmooth(pImg8u,pImg8u,CV_GAUSSIAN,7,7);
//創建內存存儲空間(默認值為0表示儲存空間是64k)
storage = cvCreateMemStorage(0);
//找出圖中的圓
circles = cvHoughCircles(pImg8u,storage,CV_HOUGH_GRADIENT,2,pImg8u->height/4,250,55);
int i;
for(i=0;itotal;i++)
{
float * p = (float *)cvGetSeqElem(circles,i);
//依據所給的圓心和半徑來做話元或填充圓的指令
cvCircle(pImage,cvPoint(cvRound(p[0]),cvRound(p[1])),cvRound(p[2]),CV_RGB(255,0,0),3,8,0);//後面代表圓的半徑,顏色,線寬,線型,段數
}
//建立視窗
cvNamedWindow("Houg Circle Transform",1);
//顯示視窗
cvShowImage("Houg Circle Transform",pImage);
//等待按鍵
cvWaitKey(0);
//刪除視窗
cvDestroyWindow("Houg Circle Transform");

cvReleaseImage(& pImage);//釋放圖片
cvReleaseImage(& pImg8u);//釋放圖片
}

所用之函數:
CvMemStorage *cvCreateMemStorage(int block_size=0);
->創造內存儲存空間 裡面宣告的參數,設為0表示儲存空間為64k.

Void cvCircle(CvArr * img,CvPoint center,int radious,CvScalarcolor,int thickness==1,int
Line_type==8,int shift==0);
->在所選擇的圖像上,依據所給的圓心和半徑來對圖形作畫圓或填充圓.

1 則留言:

  1. 對於cvHoughCircles還是不太了解如何使用

    還有在程式中
    cvCircle(pImage,cvPoint(cvRound(p[0]),cvRound(p[1])),cvRound(p[2]),CV_RGB(255,0,0),3,8,0);
    內的cvRound(p[0])不太懂.

    回覆刪除