文档章节

【Rayeager PX2分享】OpenCV入门之线段检测

穿
 穿prada的008
发布于 2015/05/26 14:38
字数 909
阅读 85
收藏 1

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

 【Rayeager PX2分享】OpenCV入门之线段检测

感谢fjjjnk1234的分享

更多请参考:http://chipspark.com/


© 著作权归作者所有

穿
粉丝 0
博文 51
码字总数 24172
作品 0
福州
私信 提问
【Rayeager PX2分享】OpenCV入门之线段检测

线段检测主要运用Hough变换,Hough变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法。主要用来从图像中分离出具有某种相同特征的几何形状(如,直线,圆等...

穿prada的008
2015/05/26
873
0
【OpenCV入门指南】第七篇 线段检测与圆检测

【OpenCV入门指南】第七篇 线段检测与圆检测 在《【OpenCV入门指南】第五篇轮廓检测上》与《【OpenCV入门指南】第六篇轮廓检测下》讲解了OpenCV的轮廓检测。本篇将讲解在OpenCV中使用线段检测...

andyhe91
2014/12/17
750
0
1- OpenCV+TensorFlow 入门人工智能图像处理-课程介绍

人工智能最火的两个方向,自然语言处理和计算机视觉 OpenCV的图像处理 TensorFlow的使用 供需关系理论,有需求所以才有提供 招聘网站: 图像算法两万以上 都需要的技能: OpenCV TensorFlow 人...

天涯明月笙
2018/04/04
0
0
【OpenCV入门指南】第四篇 图像的二值化

【OpenCV入门指南】第四篇 图像的二值化 在上一篇《【OpenCV入门指南】第三篇Canny边缘检测》中介绍了使用Canny算子对图像进行边缘检测。与边缘检测相比,轮廓检测有时能更好的反映图像的内容...

长平狐
2012/12/10
13.1K
0
【OpenCv小白入门】人脸检测

本篇小结是关于OpenCv小白入门的,分享一下自己的想法,并且较为详细的总结一下利用OpenCv自带的Haar分类器进行人脸检测以及基于OpenCV3.1+Vs2013+C++的具体代码实现。 原文链接 没有实际的操...

cleverzcc
2018/01/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

代理模式之JDK动态代理 — “JDK Dynamic Proxy“

动态代理的原理是什么? 所谓的动态代理,他是一个代理机制,代理机制可以看作是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成,通过代理可以有效的让调...

code-ortaerc
今天
5
0
学习记录(day05-标签操作、属性绑定、语句控制、数据绑定、事件绑定、案例用户登录)

[TOC] 1.1.1标签操作v-text&v-html v-text:会把data中绑定的数据值原样输出。 v-html:会把data中值输出,且会自动解析html代码 <!--可以将指定的内容显示到标签体中--><标签 v-text=""></......

庭前云落
今天
8
0
VMware vSphere的两种RDM磁盘

在VMware vSphere vCenter中创建虚拟机时,可以添加一种叫RDM的磁盘。 RDM - Raw Device Mapping,原始设备映射,那么,RDM磁盘是不是就可以称作为“原始设备映射磁盘”呢?这也是一种可以热...

大别阿郎
今天
12
0
【AngularJS学习笔记】02 小杂烩及学习总结

本文转载于:专业的前端网站☞【AngularJS学习笔记】02 小杂烩及学习总结 表格示例 <div ng-app="myApp" ng-controller="customersCtrl"> <table> <tr ng-repeat="x in names | orderBy ......

前端老手
昨天
16
0
Linux 内核的五大创新

在科技行业,创新这个词几乎和革命一样到处泛滥,所以很难将那些夸张的东西与真正令人振奋的东西区分开来。Linux内核被称为创新,但它又被称为现代计算中最大的奇迹,一个微观世界中的庞然大...

阮鹏
昨天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部