溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

OpenCV線段檢測(cè)怎么實(shí)現(xiàn)

發(fā)布時(shí)間:2022-01-04 09:45:10 來源:億速云 閱讀:255 作者:iii 欄目:互聯(lián)網(wǎng)科技

本篇內(nèi)容介紹了“OpenCV線段檢測(cè)怎么實(shí)現(xiàn)”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

線段檢測(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 <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; //最多檢測(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

“OpenCV線段檢測(cè)怎么實(shí)現(xiàn)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI