1. Hough線變換
- //Hough線變換
- #include "cv.h"
- #include "highgui.h"
- int main()
- {
- // TODO: Add your command handler code here
- IplImage* pImage= NULL;// 聲明IplImage 變量
- IplImage* pImg8u= NULL;// 聲明IplImage 變量,用於圖像格式轉換
- IplImage* pImgCanny= NULL;// 聲明IplImage 變量,用於灰度圖像Canny變換
- CvMemStorage* storage = NULL;// 聲明storage 變量,用於存儲檢測到的線段
- CvSeq* lines = NULL; //聲明lines變量,用於存儲直線的輪廓
- //讀入圖像
- pImage=cvLoadImage("Airplane.jpg", -1);
- //建立和原始圖像一樣圖像內存區,圖像元素的位深度設為IPL_DEPTH_8U
- //即無符號8位整型
- pImg8u = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U, 1);
- pImgCanny = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U, 1);
- //將彩色圖像轉換為灰度圖像
- cvCvtColor(pImage, pImg8u, CV_BGR2GRAY);
- //創建內存空間
- storage = cvCreateMemStorage(0);
- //利用Canny變換找出圖像邊緣
- cvCanny( pImg8u, pImgCanny, 50, 500, 3 );
- //Hough線變換
- lines = cvHoughLines2( pImgCanny, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 80, 30, 10 );
- //在原圖上畫紅直線
- int i;
- for( i = 0; i < lines->total; 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);
- cvReleaseImage( & pImgCanny);
- cvReleaseImage( & pImg8u);
- }
原圖
直線偵測
2. Hough圓變換
- //Hough圓變換
- #include "cv.h"
- #include "highgui.h"
- int main()
- {
- // TODO: Add your command handler code here
- IplImage* pImage= NULL;// 聲明IplImage 變量
- IplImage* pImg8u= NULL;// 聲明IplImage 變量,用於圖像格式轉換
- CvMemStorage* storage = NULL;// 聲明storage 變量,用於存儲檢測到的線段
- CvSeq* circles = NULL;
- //讀入圖像
- pImage=cvLoadImage("Airplane.jpg", -1);
- //建立和原始圖像一樣圖像內存區,圖像元素的位深度設為IPL_DEPTH_8U
- //即無符號8位整型
- pImg8u = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U, 1);
- //轉換成灰度圖像
- if(pImage->nChannels != 1)
- cvCvtColor( pImage, pImg8u, CV_BGR2GRAY );
- else
- cvCopy(pImage, pImg8u);
- //平滑化
- cvSmooth( pImg8u, pImg8u, CV_GAUSSIAN, 7, 7 );
- //創建內存空間
- storage = cvCreateMemStorage(0);
- //Hough圓變換
- circles = cvHoughCircles( pImg8u, storage, CV_HOUGH_GRADIENT, 1, pImg8u->height/4, 250, 55 );
- // 畫出識別出的圓
- int i;
- for( i = 0; i < circles->total; 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( "Hough Circle Transform", 1 );
- cvShowImage( "Hough Circle Transform", pImage);
- //等待按鍵
- cvWaitKey(0);
- //銷毀窗口
- cvDestroyWindow( " Hough Circle Transform " );
- //將程序開始定義的變量釋放
- cvReleaseImage( & pImage);
- cvReleaseImage( & pImg8u);
- }
原圖
沒有留言:
張貼留言