您好,登錄后才能下訂單哦!
本篇內容介紹了“OpenCV線段檢測怎么實現”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
線段檢測主要運用Hough變換,Hough變換是圖像處理中從圖像中識別幾何形狀的基本方法之一,應用很廣泛,也有很多改進算法。主要用來從圖像中分離出具有某種相同特征的幾何形狀(如,直線,圓等)。最基本的霍夫變換是從黑白圖像中檢測直線(線段)。
在OpenCV編程中,實現線段檢測主要使用cvHoughLines2函數。
函數原型:
CvSeq* cvHoughLines2(
CvArr* image,
void* line_storage,
int method,
double rho,
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
“OpenCV線段檢測怎么實現”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。