【Rayeager PX2分享】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)

# 编译规则 [email protected]代表目标文件 $< 代表第一个依赖文件

%.o:%.cpp

g++ -I $(INCLUDE) -o [email protected] -c $<

所在文件夹上已有hough.jpg图片,make后执行./hough hough.jpg

感谢fjjjnk1234的分享

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

时间: 2024-10-11 04:34:02

【Rayeager PX2分享】OpenCV入门之线段检测的相关文章

【Rayeager PX2分享】修改安卓开机后进入主屏幕流程分析

在之前楼主在学习了Android的启动流程后,继续学了下去,然后看了上面这位博主的分享,便对修改主屏有明确思路了 开始尝试修改开机后首次进入的界面,首先楼主先写了一个简单的apk,主要最初默认的程序中在AndroidMain里fiter里加了句 <category android:name="android.intent.category.HOME" />主要在android启动后选择主屏幕可以找到这个apk. 显示hello PX2样子如下 生成apk,然后在linux环

【Rayeager PX2分享】PX2上ttys3串口测试程序编写

在PX2开发板上有个已引出的的ttys3,大家如果用PX2来开发或者学习,时不时总是会需要用到这个串口的,而在android系统中,使用串口的方式也很简单,因为在PX2的源码中已经有了ttys3的驱动,我们只需要将起编译进内核(编译fangshihttp://bbs.chipspark.com/forum.p ... =%E4%B8%B2%E5%8F%A3)就可以像操作文件一样,操作这个串口,然后操作这个串口的时候,我们需要做的也只有先做个初始的配置,就是设置波特率,停止位,数据位,奇偶校验.

【Rayeager PX2分享】解决px2开发板的usb转串口不可用问题

本人在使用px2开发板的usb作为串口时遇到问题,在/dev目录下有出现ttyusb0,但不可用.注:没有插上串口线是不会出现ttyusb0的. 解决办法如下: 1.请用本帖提供的usb-serial.c与usb-serial.h文件替换px2所自带的文件.文件路径如下:/home/zoubin/sdk/kernel/drivers/usb/serial. 2.进入kernel目录下,进行make menuconfig来配置内核编译选项.选项如下:Devces drivers-->USB seu

【Rayeager PX2分享】最简单helloworld驱动编写

论坛里应该有一部分人是想学驱动,却不知道该怎么入门吧,在这里我教大家写一个helloworld的简单随linux内核加载的驱动. 1.首先在/kernel/drivers下建一个新的文件夹hello,在文件夹里添加四个文件分别是hello.c,hello.hKconfig,Makefile, hello.c文件里也有注释,这个文件主要就是为了注册和初始化设备文件以及定义驱动接口,主要是用啦file_operations这个结构体,大家想了解驱动可以先了解这个,这个程序里的注释可以帮助大家理解下一

【OpenCV入门指南】第七篇 线段检测与圆检测

[OpenCV入门指南]第七篇 线段检测与圆检测 在<[OpenCV入门指南]第五篇轮廓检测上>与<[OpenCV入门指南]第六篇轮廓检测下>讲解了OpenCV的轮廓检测.本篇将讲解在OpenCV中使用线段检测与圆检测. 线段检测与圆检测主要运用Hough变换,Hough变换是一种利用图像的全局特征将特定形状的边缘连接起来,形成连续平滑边缘的一种方法.它通过将源图像上的点影射到用于累加的参数空间,实现对已知解析式曲线进行识别. 在OpenCV编程中,线段检测和圆检测已经封装成函数了

【OpenCV入门指南】第十三篇 人脸检测

[OpenCV入门指南]第十三篇 人脸检测 本篇介绍图像处理与模式识别中最热门的一个领域--人脸检测(人脸识别).人脸检测可以说是学术界的宠儿,在不少EI,SCI高级别论文都能看到它的身影.甚至很多高校学生的毕业设计都会涉及到人脸检测.当然人脸检测的巨大实用价值也让很多公司纷纷关注,很多公司都拥有这方面的专利或是开发商业产品出售. 在OpenCV中,人脸检测也是其热门应用之一.在OpenCV的特征检测专题就详细介绍了人脸检测的原理--通过Haar特征来识别是否为人脸.Haar特征检测原理与Haa

【OpenCV入门教程之十七】OpenCV重映射 &amp; SURF特征点检测合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/30974513 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http://www.zhihu.com/people/mao-xing-yun 邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本: 2.4.9 本篇文章中,我们一起探讨了OpenCV中

【OpenCV入门指南】第六篇 轮廓检测 下

<OpenCV入门指南>系列文章地址:http://blog.csdn.net/morewindows/article/category/863841 上一篇<[OpenCV入门指南]第五篇轮廓检测上>介绍了cvFindContours函数和cvDrawContours函数,并作了一个简单的使用示范.本篇将展示一个实例,让大家对轮廓检测有个更加深入的认识. 代码如下: //图像的轮廓检测下 //By MoreWindows (http://blog.csdn.net/MoreWin

【OpenCV入门指南】第八篇 灰度直方图

直方图(Histogram)又称柱状图.质量分布图,是一种统计报告图.直方图由一系列高度不等的纵向条纹或线段表示数据分布的情况.一般用横轴表示数据类型,纵轴表示分布情况.在图像处理上,直方图是图像信息统计的有力工具. 灰度直方图是指对图像的灰度信息进行统计,我们知道灰度图在图像处理中应用非常广泛,在前面的<OpenCV第三篇Canny边缘检测>.<OpenCV第五篇轮廓检测上>.<OpenCV第六篇轮廓检测下>均能找到灰度图的用武之地.因此灰度直方图具有较高的实用价值.