Opencv Hough算法实现图片中直线检测

本文实例为大家分享了Opencv Hough算法实现直线检测的具体代码,供大家参考,具体内容如下

(1)载入需检测的图及显示原图

Mat g_srcImage = imread("C:\\Users\\lenovo\\Pictures\\Saved Pictures\\Q.jpg"); //图片所放路径
imshow("【原始图】", g_srcImage);

(2)为显示不同的效果图而设置滑动条

namedWindow("【效果图】", 1);
createTrackbar("值", "【效果图】", &g_nthreshold, 200, on_HoughLines);

(3)图像处理及显示

//进行边缘检测和转化为灰度图
 Canny(g_srcImage, g_midImage, 50, 200, 3);//进行一次canny边缘检测
 cvtColor(g_midImage, g_dstImage, CV_GRAY2BGR);//转化边缘检测后的图为灰度图
 //调用一次回调函数,调用一次HoughLinesP函数
 on_HoughLines(g_nthreshold, 0);
 HoughLinesP(g_midImage, g_lines, 1, CV_PI / 180, 80, 50, 10);
 //显示效果图
 imshow("【效果图】", g_dstImage);
 waitKey(0);
 return 0;

(4)主要函数:on_HoughLines()

//定义局部变量储存全局变量
 Mat dstImage = g_dstImage.clone();
 Mat midImage = g_midImage.clone();
 //调用HoughLinesP函数
 vector<Vec4i> mylines;
 HoughLinesP(midImage, mylines, 1, CV_PI / 180, g_nthreshold + 1, 50, 10);
 //循环遍历绘制每一条线段
 for (size_t i = 0; i < mylines.size(); i++)
 {
 Vec4i l = mylines[i];
 line(dstImage, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(23, 180, 55), 1, CV_AA);
 }
 //显示图像
 imshow("【效果图】", dstImage);

(5)源代码:

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp> 

using namespace std;
using namespace cv;

Mat g_srcImage, g_dstImage, g_midImage;//原始图、中间图和效果图
vector<Vec4i> g_lines;//定义一个矢量结构g_lines用于存放得到的线段矢量集合
//变量接收的TrackBar位置参数
int g_nthreshold = 100;

static void on_HoughLines(int, void*);//回调函数
static void ShowHelpText();

int main()
{
 //改变console字体颜色
 system("color 3F");
 ShowHelpText();
 //载入原始图和Mat变量定义
 Mat g_srcImage = imread("C:\\Users\\lenovo\\Pictures\\Saved Pictures\\Q.jpg");
 //显示原始图
 imshow("【原始图】", g_srcImage);
 //创建滚动条
 namedWindow("【效果图】", 1);
 createTrackbar("值", "【效果图】", &g_nthreshold, 200, on_HoughLines);
 //进行边缘检测和转化为灰度图
 Canny(g_srcImage, g_midImage, 50, 200, 3);//进行一次canny边缘检测
 cvtColor(g_midImage, g_dstImage, CV_GRAY2BGR);//转化边缘检测后的图为灰度图
 //调用一次回调函数,调用一次HoughLinesP函数
 on_HoughLines(g_nthreshold, 0);
 HoughLinesP(g_midImage, g_lines, 1, CV_PI / 180, 80, 50, 10);
 //显示效果图
 imshow("【效果图】", g_dstImage);
 waitKey(0);
 return 0;
}
static void on_HoughLines(int, void*)
{
 //定义局部变量储存全局变量
 Mat dstImage = g_dstImage.clone();
 Mat midImage = g_midImage.clone();
 //调用HoughLinesP函数
 vector<Vec4i> mylines;
 HoughLinesP(midImage, mylines, 1, CV_PI / 180, g_nthreshold + 1, 50, 10);
 //循环遍历绘制每一条线段
 for (size_t i = 0; i < mylines.size(); i++)
 {
 Vec4i l = mylines[i];
 line(dstImage, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(23, 180, 55), 1, CV_AA);
 }
 //显示图像
 imshow("【效果图】", dstImage);
}
static void ShowHelpText()
{
 //输出一些帮助信息
 printf("\n\n\n\t通过调整滚动条观察图像的不同效果~\n\n");
 printf("\n\n\t\t\t by浅墨");
}

(6)原图:

效果图(调节滑条显示不同结果图):

值为100时:

值为23时:

值为60时:

值为126时:

值为184时:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • OpenCV霍夫变换(Hough Transform)直线检测详解

    霍夫变换(Hough Transform)的主要思想: 一条直线在平面直角坐标系(x-y)中可以用y=ax+b式表示,对于直线上一个确定的点(x0,y0),总符合y0-ax0=b,而它可以表示为参数平面坐标系(a-b)中的一条直线.因此,图像中的一个点对应参数平面的一条直线,同样,图像中的一条直线对应参数平面上的一个点. 基本Hough变换检测直线: 由于同一条直线上的不同点在参数平面中是会经过同一个点的多条线.对图像的所有点作霍夫变换,检测直线就意味着找到对应参数平面中的直线相交最多的点.对这

  • OpenCV利用霍夫变换进行直线检测

    本文实例为大家分享了OpenCV利用霍夫变换进行直线检测的具体代码,供大家参考,具体内容如下 1.最简单的霍夫变换是在图像中识别直线.在平面直角坐标系(x-y)中,一条直线可以用下式表示:y=kx+b. 这表示参数平面(k-b)中的一条直线.因此,图像中的一个点对应参数平面中的一条直线,图像中的一条直线对应参数平面中的一个点.对图像上所有的点作霍夫变换,最终所要检测的直线对应的一定是参数平面中直线相交最多的那个点.这样就在图像中检测出了直线.在实际应用中,直线通常采用参数方程:p=x\cos\t

  • Java+opencv3.2.0实现hough直线检测

    hough变换是图像处理中的一种特征提取技术,该过程在一个参数空间中通过计算累计结果的局部最大值得到一个符合特定形状的集合作为hough变换结果. 发展史: 1962年由PaulHough首次提出,用来检测直线和曲线. 1972年由Richard Duda & Peter Hart推广使用,扩展到任意形状物体的识别. 原理: 一条直线在直角坐标系下的表示形式为y=k*x+b,而在极坐标系下表示为r=x*cos(theta)+y*sin(theta).hough变换的思想为在直角坐标系下的一个点对

  • OpenCV实现图像的直线检测

    上一篇博文介绍了图像的Canny边缘检测,本文主要介绍图像的直线检测部分,主要使用概率霍夫变换来检测直线,调用的函数为HoughLinesP(),下面给出代码部分以及直线检测效果图: 1.代码部分: // Detect_Lines.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <cv.h> #include "highgui.h" using namespace std; using names

  • 利用Opencv中Houghline方法实现直线检测

    利用Opencv中的Houghline方法进行直线检测-python语言 这是给Python部落翻译的文章,请在这里看原文. 在图像处理中,霍夫变换用来检测任意能够用数学公式表达的形状,即使这个形状被破坏或者有点扭曲. 下面我们将看到利用HoughLine算法来阐述霍夫变化进行直线检测的原理,把此算法应用到特点图像的边缘检测是可取的.边缘检测方法请参考这篇文章–边缘检测. Houghline算法基础 直线可以表示为y=mx+c,或者以极坐标形式表示为r=xcosθ+ysinθ,其中r是原点到直线

  • Opencv Hough算法实现图片中直线检测

    本文实例为大家分享了Opencv Hough算法实现直线检测的具体代码,供大家参考,具体内容如下 (1)载入需检测的图及显示原图 Mat g_srcImage = imread("C:\\Users\\lenovo\\Pictures\\Saved Pictures\\Q.jpg"); //图片所放路径 imshow("[原始图]", g_srcImage); (2)为显示不同的效果图而设置滑动条 namedWindow("[效果图]", 1);

  • Python OpenCV Hough直线检测算法的原理实现

    目录 直线检测原理 OpenCV实现 直线检测原理 核心要点:图像坐标空间.参数空间.极坐标参数空间 -> (极坐标)参数空间表决 给定一个点,我们一般会写成y=ax+b的形式,这是坐标空间的写法:我们也可以写成b=-xa+y的形式,这是参数空间的写法.也就是说,给定一个点,那么经过该点的直线的参数必然满足b=-xa+y这一条件,也就是必然在参数空间中b=-xa+y这条直线上.如果给定两个点,那么这两点确定的唯一的直线的参数,就是参数空间中两条参数直线的交点. 由于上述写法不适合处理水平或垂直的

  • Python+OpenCV图像处理——实现直线检测

    简介: 1.霍夫变换(Hough Transform) 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法.主要用来从图像中分离出具有某种相同特征的几何形状(如,直线,圆等).最基本的霍夫变换是从黑白图像中检测直线(线段). 2.Hough变换的原理是将特定图形上的点变换到一组参数空间上,根据参数空间点的累计结果找到一个极大值对应的解,那么这个解就对应着要寻找的几何形状的参数(比如说直线,那么就会得到直线的斜率k与常熟b,圆就会得到圆心与半径等等) 3.霍夫线变

  • OpenCV实现霍夫变换直线检测

    霍夫变换(Hough Transform)是图像处理中检测是否存在直线的重要算法,该算法是由Paul Hough在1962年首次提出,最开始只能检测图像中的直线,但是霍夫变换经过不断的扩展和完善已经可以检测多种规则形状,例如圆形.椭圆等.霍夫变换通过将图像中的像素在一个空间坐标系中变换到另一个坐标空间坐标系中,使得在原空间中具有形同特性的曲线或者直线映射到另一个空间中形成峰值,从而把检测任意形状的问题转化为统计峰值的问题. 霍夫变换通过构建检测形状的数学解析式将图像中像素点映射到参数空间中,例如

  • python opencv实现直线检测并测出倾斜角度(附源码+注释)

    由于学习需要,我想要检测出图片中的直线,并且得到这些直线的角度.于是我在网上搜了好多直线检测的代码,但是没有搜到附有计算直线倾斜角度的代码,所以我花了一点时间,自己写了一份直线检测并测出倾斜角度的代码,希望能够帮助到大家! 注:这份代码只能够检测简单结构图片的直线,复杂结构的图片还需要设置合理的参数 下面展示 源码. import cv2 import numpy as np def line_detect(image): # 将图片转换为HSV hsv = cv2.cvtColor(image

  • Android基于OpenCV实现霍夫直线检测

    目录 霍夫直线检测 点和线的对偶性 极坐标参数方程 API 操作 效果 霍夫直线检测 点和线的对偶性 图像空间中的点,对应霍夫空间中的直线 图像空间中的直线,对应霍夫空间中的点 共点的直线,在霍夫空间中对应的点在一条直线上 共线的点,在霍夫空间中对应的直线交于一点 极坐标参数方程 对于平面中的一条直线,在笛卡尔坐标中,常见的有点斜式,两点式两种表示方法.然而在霍夫变换中,考虑的是另外一种表示方式:使用(r, theta)来表示一条直线.其中r为该直线到原点的距离,theta为该直线的垂线与x轴的

  • OpenCV半小时掌握基本操作之直线检测

    目录 概述 霍夫直线变换 原理详解 代码实战 HoughLines HoughLinesP [OpenCV] ⚠️高手勿入! 半小时学会基本操作 ⚠️ 直线检测 概述 OpenCV 是一个跨平台的计算机视觉库, 支持多语言, 功能强大. 今天小白就带大家一起携手走进 OpenCV 的世界. (第 13 课) 霍夫直线变换 霍夫变换 (Hough Line Transform) 是图像处理中的一种特征提取技术. 通过平面空间到极值坐标空间的转换, 可以帮助我们实现直线检测. 如图: 原理详解 当我

随机推荐