線段檢測(cè)主要運(yùn)用Hough變換,Hough變換是圖像處理中從圖像中識(shí)別幾何形狀的基本方法之一,應(yīng)用很廣泛,也有很多改進(jìn)算法。主要用來從圖像中分離出具有某種相同特征的幾何形狀(如,直線,圓等)。最基本的霍夫變換是從黑白圖像中檢測(cè)直線(線段)。 在OpenCV編程中,實(shí)現(xiàn)線段檢測(cè)主要使用cvHoughLines2函數(shù)。 函數(shù)原型: CvSeq* cvHoughLines2( CvArr* image, void* line_storage, int method, double rho, double theta, int threshold, double param1=0, double param2=0 ); 參數(shù)說明: 第一個(gè)參數(shù)表示輸入圖像,必須為二值圖像(黑白圖)。 第二個(gè)參數(shù)表示存儲(chǔ)容器,可以傳入CvMemStorage類型的指針。 第三個(gè)參數(shù)表示變換變量,可以取下面的值: CV_HOUGH_STANDARD - 傳統(tǒng)或標(biāo)準(zhǔn) Hough 變換. 每一個(gè)線段由兩個(gè)浮點(diǎn)數(shù) (ρ, θ) 表示,其中 ρ 是線段與原點(diǎn) (0,0) 之間的距離,θ 線段與 x-軸之間的夾角。 CV_HOUGH_PROBABILISTIC - 概率 Hough 變換(如果圖像包含一些長(zhǎng)的線性分割,則效率更高)。它返回線段分割而不是整個(gè)線段。每個(gè)分割用起點(diǎn)和終點(diǎn)來表示。 CV_HOUGH_MULTI_SCALE - 傳統(tǒng) Hough 變換的多尺度變種。線段的編碼方式與 CV_HOUGH_STANDARD 的一致。 第四個(gè)參數(shù)表示與象素相關(guān)單位的距離精度。 第五個(gè)參數(shù)表示弧度測(cè)量的角度精度。 第六個(gè)參數(shù)表示檢測(cè)線段的最大條數(shù),如果已經(jīng)檢測(cè)這么多條線段,函數(shù)返回。 第七個(gè)參數(shù)與第三個(gè)參數(shù)有關(guān),其意義如下: 對(duì)傳統(tǒng) Hough 變換,不使用(0). 對(duì)概率 Hough 變換,它是最小線段長(zhǎng)度. 對(duì)多尺度 Hough 變換,它是距離精度 rho 的分母 (大致的距離精度是 rho 而精確的應(yīng)該是 rho / param1 ). 第八個(gè)參數(shù)與第三個(gè)參數(shù)有關(guān),其意義如下: 對(duì)傳統(tǒng) Hough 變換,不使用 (0). 對(duì)概率 Hough 變換,這個(gè)參數(shù)表示在同一條線段上進(jìn)行碎線段連接的最大間隔值(gap), 即當(dāng)同一條線段上的兩條碎線段之間的間隔小于param2時(shí),將其合二為一。 對(duì)多尺度 Hough 變換,它是角度精度 theta 的分母 (大致的角度精度是 theta 而精確的角度應(yīng)該是 theta / param2)。 示例程序: hough.cpp #include #include #include #include #include using namespace std; int main (int argc, char **argv) { const char *pstrWindowsSrcTitle = "initial"; const char *pstrWindowsLineName = "hough"; IplImage *pSrcImage = cvLoadImage("hough.jpg", CV_LOAD_IMAGE_UNCHANGED); IplImage *pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1); cvCvtColor(pSrcImage, pGrayImage, CV_BGR2GRAY); IplImage *pCannyImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1); cvCanny(pGrayImage, pCannyImage, 30, 90); CvMemStorage *pcvMStorage = cvCreateMemStorage(); double fRho = 1; double fTheta = CV_PI / 180; int nMaxLineNumber = 50; //最多檢測(cè)條直線 double fMinLineLen = 50; //最小線段長(zhǎng)度 double fMinLineGap = 10; //最小線段間隔 CvSeq *pcvSeqLines = cvHoughLines2(pCannyImage, pcvMStorage, CV_HOUGH_PROBABILISTIC, fRho, fTheta, nMaxLineNumber, fMinLineLen, fMinLineGap); IplImage *pColorImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 3); cvCvtColor(pCannyImage, pColorImage, CV_GRAY2BGR); int i; for(i = 0; i < pcvSeqLines->total; i++) { CvPoint* line = (CvPoint*)cvGetSeqElem(pcvSeqLines, i); cvLine(pColorImage, line[0], line[1], CV_RGB(255,0,0), 2); } cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE); cvShowImage(pstrWindowsSrcTitle, pSrcImage); cvNamedWindow(pstrWindowsLineName, CV_WINDOW_AUTOSIZE); cvShowImage(pstrWindowsLineName, pColorImage); cvWaitKey(0); cvReleaseMemStorage(&pcvMStorage); cvDestroyWindow(pstrWindowsSrcTitle); cvDestroyWindow(pstrWindowsLineName); cvReleaseImage(&pSrcImage); cvReleaseImage(&pGrayImage); cvReleaseImage(&pCannyImage); cvReleaseImage(&pColorImage); return 0; } makefile: INCLUDE = $(shell pkg-config --cflags opencv) LIBS = $(shell pkg-config --libs opencv) SOURCES = hough.cpp # 目標(biāo)文件 OBJECTS = $(SOURCES:.cpp=.o) # 可執(zhí)行文件 TARGET = hough $(TARGET)(OBJECTS) g++ -o $(TARGET) $(OBJECTS) -I $(INCLUDE) $(LIBS) $(OBJECTS)(SOURCES) g++ -c $(SOURCES) clean: rm $(OBJECTS) $(TARGET) # 編譯規(guī)則 $@代表目標(biāo)文件 $< 代表第一個(gè)依賴文件 %.o:%.cpp g++ -I $(INCLUDE) -o $@ -c $< 所在文件夾上已有hough.jpg圖片,make后執(zhí)行./hough hough.jpg 【Rayeager PX2分享】OpenCV入門之線段檢測(cè) 感謝fjjjnk1234的分享 更多請(qǐng)參考:http://chipspark.com/ |