OpenCV线段检测怎么实现

本篇内容介绍了“OpenCV线段检测怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

创新互联建站是一家专业提供凉山州企业网站建设,专注与成都网站制作、网站设计、H5场景定制、小程序制作等业务。10年已为凉山州众多企业、政府机构等服务。创新互联专业网络公司优惠进行中。

线段检测主要运用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

#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; //最多检测条直线

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线段检测怎么实现”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!


分享标题:OpenCV线段检测怎么实现
本文链接:http://scyanting.com/article/gjghjj.html