#include
#include
int main()
{
IplImage * img = NULL; // 建立 IplImage 指標變數 img 並且設值為 NULL
IplImage* pImage = NULL; // 建立 IplImage 指標變數 pImage 並且設值為 NULL
IplImage* pImg8u = NULL; // 建立 IplImage 指標變數 pImg8u 並且設值為 NULL ,用於圖像格式轉換
IplImage* pImgCanny = NULL; // 建立 IplImage 指標變數 pImgCanny 並且設值為 NULL ,用於灰度圖像Canny變換
CvMemStorage* storage = NULL; // 建立 CvMemStorage 指標變數 storage 並且設值為 NULL ,用於儲存偵測到的線段
CvSeq* lines = NULL; // 建立 CvSeq 指標變數 lines 並且設值為 NULL ,用於儲存直線的輪廓
img=cvLoadImage("img.jpg"); //將圖片img讀入
pImage = cvCloneImage(img); //將已讀入系統的圖像img複製兩份,一份為背景圖像
pImg8u = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U,1); //建立一個大小與pImage相等且深度為8的圖 <無符號>
pImgCanny = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U,1); //建立一個大小與pImage相等且深度為8的圖 <無符號>
cvCvtColor(pImage,pImg8u,CV_BGR2GRAY); //將彩色圖像轉換為灰色圖像
storage = cvCreateMemStorage(0); //建立內存空間
cvCanny(pImg8u,pImgCanny,50,500,3); // 利用Canny變換找出圖像邊緣
lines = cvHoughLines2(pImgCanny,storage,CV_HOUGH_PROBABILISTIC,1,CV_PI/180,80,30,10); // Hough線變換
//在原圖上畫紅直線
for(int i=0 ; i
{
CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i);
cvLine(pImage,line[0],line[1],CV_RGB(255,0,0),3,8);
}
cvNamedWindow("Hough Line Transform",1); //建立窗口
cvShowImage("Hough Line Transform",pImage); //顯示圖像
cvWaitKey(0); //等待按鍵
cvDestroyWindow("Hough Line Transform"); // 銷毀窗口
cvReleaseImage(&pImage); //將 pImage 程式一開始定義的變量釋放
cvReleaseImage(&pImgCanny); //將 pImgCanny 程序一開始定義的變量釋放
cvReleaseImage(&pImg8u); //將 pImg8u 程序一開始定義的變量釋放
}
原理
Hough變換的原理是利用圖像空間與參數空間的對應關係,將圖像空間的具有一定關係的像素進行聚類,利用某一解析形式轉化到參數空間,通過在參數空間進行簡單的累加統計來完成檢測任務。
Hough直線變換是利用點-線的對偶性。如
由於X-Y座標中的垂直線的k值為無窮大,計算不便,故使用點-正弦函數線對偶變換解決這一問題。
Ρ = x * cos(α) + y * sin(α)
在極座標α-Ρ中變為一條正弦曲線,α取( 0 ~ 180度 )。
6-5的程式主要是Hough直線變換,所偵測到之直線,就將其變換為紅色直線;我們看程式執行的圖與原圖,直線都變為紅色,圓形則不變。
所使用OpenCV相關函數
1. cvHoughLines2 :利用Hough變換在二值圖像中找到直線。
2. cvCreatMemStorage:創建內存存儲空間。
3. cvHoughCircles:利用Hough變換在二值圖像中找到圓。
4. cvLine:在輸入圖像上指定兩點間畫線。
5. cvCircle:在輸入圖像上,根據給定的圓心和半徑畫圓或填充圓。
6. cvCloneImage:複製圖像,包括头,ROI (Region Of Interesting)和數據。
7. cvCreatImage:創建圖並分配數據。
8. cvCvtColor:將彩色圖像轉換成其他顏色之圖像。
cvCvtColor(pImage,pImg8u,CV_BGR2GRAY)
9. cvCanny:利用Canny算法發現輸入圖像的邊緣而且在輸出圖像中標識這些
邊緣。threshold1和threshold2當中的小域值是控制邊緣連接,大
域值用來控制強邊緣的初始分割。
10. cvNamedWindow:建立一個放置圖像和trackbar的窗口。
11. cvShowImage:在指定的窗口顯示圖像。
12. cvWaitKey:使程序等待幾毫秒,讓窗口完成重繪在執行其他操作。
13. cvDestoryWindow:銷毀指定名字的窗口。
14. cvReleaseImage:銷毀已定義的IplImage指針變量,釋放佔用的內存空間。
沒有留言:
張貼留言