我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 1915|回复: 2

[技术文章] 【Rayeager PX2分享】OpenCV入门之线段检测

[复制链接]

该用户从未签到

36

主题

1

回帖

33

积分

一级逆天

积分
33

社区居民

QQ
发表于 2015-5-26 13:52:14 | 显示全部楼层 |阅读模式
线段检测主要运用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入门之线段检测
20150524223852_34889.jpg

感谢fjjjnk1234的分享
更多请参考:http://chipspark.com/
回复

使用道具 举报

该用户从未签到

20

主题

722

回帖

1154

积分

1元学习PADS(3期)

积分
1154

社区居民终身成就奖

QQ
发表于 2015-5-27 08:53:48 | 显示全部楼层
回复

使用道具 举报

  • TA的每日心情
    开心
    昨天 08:37
  • 签到天数: 26 天

    [LV.4]偶尔看看III

    74

    主题

    2252

    回帖

    6051

    积分

    二级逆天

    积分
    6051

    社区居民终身成就奖忠实会员社区劳模最爱沙发社区明星宣传大使奖优秀斑竹奖特殊贡献奖

    QQ
    发表于 2015-5-27 12:35:05 | 显示全部楼层
    一个人要成就一番事业,需要高人指点、贵人相助、家人相随、小人监督!!!!!
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    论坛开启做任务可以
    额外奖励金币快速赚
    积分升级了


    Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

    本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

    平平安安
    TOP
    快速回复 返回顶部 返回列表