【Rayeager PX2分享】OpenCV入門之線段檢測

線段檢測主要運用Hough變換,Hough變換是圖像處理中從圖像中識別幾何形狀的基本方法之一,應用很普遍,也有不少改進算法。主要用來從圖像中分離出具備某種相同特徵的幾何形狀(如,直線,圓等)。最基本的霍夫變換是從黑白圖像中檢測直線(線段)。ios

在OpenCV編程中,實現線段檢測主要使用cvHoughLines2函數。算法

函數原型:shell

CvSeq* cvHoughLines2(編程

  CvArr* image,函數

  void* line_storage,ui

  int method,編碼

  double rho,spa

  double theta,指針

  int threshold,圖片

  double param1=0, double param2=0

);


參數說明:

第一個參數表示輸入圖像,必須爲二值圖像(黑白圖)。

第二個參數表示存儲容器,能夠傳入CvMemStorage類型的指針。

第三個參數表示變換變量,能夠取下面的值:

  CV_HOUGH_STANDARD - 傳統或標準 Hough 變換. 每個線段由兩個浮點數 (ρ, θ) 表示,其中 ρ 是線段與原點 (0,0) 之間的距離,θ 線段與 x-軸之間的夾角。

  CV_HOUGH_PROBABILISTIC - 機率 Hough 變換(若是圖像包含一些長的線性分割,則效率更高)。它返回線段分割而不是整個線段。每一個分割用起點和終點來表示。

  CV_HOUGH_MULTI_SCALE - 傳統 Hough 變換的多尺度變種。線段的編碼方式與 CV_HOUGH_STANDARD 的一致。

第四個參數表示與象素相關單位的距離精度。

第五個參數表示弧度測量的角度精度。

第六個參數表示檢測線段的最大條數,若是已經檢測這麼多條線段,函數返回。

第七個參數與第三個參數有關,其意義以下:

  對傳統 Hough 變換,不使用(0).

  對機率 Hough 變換,它是最小線段長度.

  對多尺度 Hough 變換,它是距離精度 rho 的分母 (大體的距離精度是 rho 而精確的應該是 rho / param1 ).

第八個參數與第三個參數有關,其意義以下:

  對傳統 Hough 變換,不使用 (0).

  對機率 Hough 變換,這個參數表示在同一條線段上進行碎線段鏈接的最大間隔值(gap), 即當同一條線段上的兩條碎線段之間的間隔小於param2時,將其合二爲一。

  對多尺度 Hough 變換,它是角度精度 theta 的分母 (大體的角度精度是 theta 而精確的角度應該是 theta / param2)。


示例程序:

hough.cpp


 #include <opencv2/core/core.hpp>

#include <opencv2/opencv.hpp>

#include <opencv2/imgproc/imgproc.hpp>

#include <opencv2/highgui/highgui.hpp>

#include <iostream>


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; //最多檢測條直線

double fMinLineLen = 50; //最小線段長度

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  

# 目標文件  

OBJECTS = $(SOURCES:.cpp=.o)  

# 可執行文件  

TARGET = hough  

$(TARGET):$(OBJECTS)  

g++ -o $(TARGET) $(OBJECTS) -I $(INCLUDE) $(LIBS)  

$(OBJECTS):$(SOURCES)  

g++ -c $(SOURCES)  

clean:  

rm $(OBJECTS) $(TARGET)  

# 編譯規則 $@表明目標文件 $< 表明第一個依賴文件  

%.o:%.cpp  

g++ -I $(INCLUDE) -o $@ -c $<


所在文件夾上已有hough.jpg圖片,make後執行./hough hough.jpg

 【Rayeager PX2分享】OpenCV入門之線段檢測

感謝fjjjnk1234的分享

更多請參考:http://chipspark.com/

相關文章
相關標籤/搜索