C++ Opencv HoughLines()用霍夫变换在二元图像中寻线
一、霍夫变换简介
参考http://homepages.inf.ed.ac.uk/rbf/HIPR2/hough.htm
二、HoughLines()函数详解

该函数接受的输入矩阵只能是8位单通道的二值化灰度图。
三、代码及结果分享
#include<opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
void myHough(Mat src, Mat dst)
{
vector<Vec2f> lines;//用于储存参数空间的交点
HoughLines(src, lines, 1, CV_PI / 180, 120, 0, 0);//针对不同像素的图片注意调整阈值
const int alpha = 1000;//alpha取得充分大,保证画出贯穿整个图片的直线
//lines中存储的是边缘直线在极坐标空间下的rho和theta值,在图像空间(直角坐标系下)只能体现出一个点
//以该点为基准,利用theta与斜率之间的关系,找出该直线上的其他两个点(可能不在图像上),之后以这两点画出直线
for (size_t i = 0; i < lines.size(); i++)
{
float rho = lines[i][0], theta = lines[i][1];
double cs = cos(theta), sn = sin(theta);
double x = rho * cs, y = rho * sn;
Point pt1(cvRound(x + alpha * (-sn)), cvRound(y + alpha * cs));
Point pt2(cvRound(x - alpha * (-sn)), cvRound(y - alpha * cs));
line(dst, pt1, pt2, Scalar(0, 0, 255), 1, LINE_AA);
}
}
int main()
{
Mat mImage = imread("box.jpg");
if (mImage.data == 0)
{
cerr << "Image reading error !" << endl;
system("pause");
}
namedWindow("The original image", WINDOW_NORMAL);
imshow("The original image", mImage);
Mat mMiddle ;
cvtColor(mImage, mMiddle, COLOR_BGR2GRAY);//Canny()只接受单通道8位图像,边缘检测前先将图像转换为灰度图
Canny(mImage, mMiddle, 50, 150, 3);//边缘检测,检测结果作为霍夫变换的输入
Mat mResult = mImage.clone();
myHough(mMiddle, mResult);//将结果展示在原图像上
namedWindow("The processed image", WINDOW_NORMAL);
imshow("The processed image", mResult);
waitKey();
destroyAllWindows();
return 0;
}

C++ Opencv HoughLines()用霍夫变换在二元图像中寻线的更多相关文章
- 【opencv学习笔记七】访问图像中的像素与图像亮度对比度调整
今天我们来看一下如何访问图像的像素,以及如何改变图像的亮度与对比度. 在之前我们先来看一下图像矩阵数据的排列方式.我们以一个简单的矩阵来说明: 对单通道图像排列如下: 对于双通道图像排列如下: 那么对 ...
- opencv —— HoughLines、HoughLinesP 霍夫线变换原理(标准霍夫线变换、多尺度霍夫线变换、累积概率霍夫线变换)及直线检测
霍夫线变换的原理 一条直线在图像二维空间可由两个变量表示,有以下两种情况: ① 在笛卡尔坐标系中:可由参数斜率和截距(k,b)表示. ② 在极坐标系中:可由参数极经和极角(r,θ)表示. 对于霍夫线变 ...
- OpenCV 编程简单介绍(矩阵/图像/视频的基本读写操作)
PS. 因为csdn博客文章长度有限制,本文有部分内容被截掉了.在OpenCV中文站点的wiki上有可读性更好.而且是完整的版本号,欢迎浏览. OpenCV Wiki :<OpenCV 编程简单 ...
- OpenCV成长之路(2):图像的遍历
我们在实际应用中对图像进行的操作,往往并不是将图像作为一个整体进行操作,而是对图像中的所有点或特殊点进行运算,所以遍历图像就显得很重要,如何高效的遍历图像是一个很值得探讨的问题. 一.遍历图像的4种方 ...
- OpenCV成长之路(7):图像滤波
滤波实际上是信号处理里的一个概念,而图像本身也可以看成是一个二维的信号.其中像素点灰度值的高低代表信号的强弱. 高频:图像中灰度变化剧烈的点. 低频:图像中平坦的,灰度变化不大的点. 根据图像的高频与 ...
- OpenCV成长之路(5):图像直方图的应用
正如第4篇文章所说的图像直方图在特征提取方面有着很重要的作用,本文将举两个实际工程中非常实用的例子来说明图像直方图的应用. 一.直方图的反向映射. 我们以人脸检测举例,在人脸检测中,我们第一步往往需要 ...
- OpenCV成长之路(4):图像直方图
一.图像直方图的概念 图像直方图是反映一个图像像素分布的统计表,其实横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的.纵坐标代表了每一种颜色值在图像中的像素总数或者占所有像素个数的百分比. 图 ...
- (转) OpenCV学习笔记大集锦 与 图像视觉博客资源2之MIT斯坦福CMU
首页 视界智尚 算法技术 每日技术 来打我呀 注册 OpenCV学习笔记大集锦 整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的 ...
- 访问图像中的像素[OpenCV 笔记16]
再更一发好久没更过的OpenCV,不过其实写到这个部分对计算机视觉算法有所了解的应该可以做到用什么查什么了,所以后面可能会更的慢一点吧,既然开了新坑,还是机器学习更有研究价值吧... 图像在内存中的存 ...
随机推荐
- 将Windows系统移到另一个硬盘
原先的128GB SSD,给Windows用是够了,最近虚拟机用得多,靠以前的SSD外挂着用,实在有点不爽,就入手一个256GB的,重装系统是个令人头疼的事情,当然不能干.想起来以前另一个机器操作的时 ...
- Putty6.0 提示Access denied
1.如果putty能正常使用,解决方法很简单: 只要在Putty的configuration里面Connection->SSH->Auth->GSSAPI的配置中,去掉默认的Atte ...
- ICSE 2018 论文
仅简单分析自己感兴趣的论文. 9.6 Million Links in Source Code Comments: Purpose, Evolution, and Decay 分析了 source c ...
- 第一二次java实训作业
1. 声明一个整型变量a,并赋初值5,在程序中判断a是奇数还是偶数,然后输出判断的结果. package java1; public class java1 { static int a=5; pub ...
- Spring事务,Bean生命周期
一.事务相关: 1.Spring事务基于Spring AOP切面编程: 2.AOP基于代理模式,得到需要开启事务的代码的代理对象: 3.而没有开启事务的Service方法里调用了开启事务 @Trans ...
- 常见的hbase jar
- [原创]networkx 画中文节点
一直想分享一些自己遇到的坑,但确实很多时候走的太快 很多想做的事情会被快节奏的生活冲淡, 在公司做事反而比学校还自在, 因为是悠闲的实习期... 几点小建议写在前头--xdj: 遇到问题,大多数人首先 ...
- 20175316盛茂淞 2018-2019-2《Java程序设计》结对编程项目-四则运算 第二周(6)
20175316与20175329 结对编程练习_四则运算(第二周) 1.需求分析 实现一个命令行程序,要求: 自动生成指定数量的小学四则运算题目(加.减.乘.除) 支持整数 统计正确率 支持多运算符 ...
- 《Linux就该这么学》第十六天课程
今天笔记有点少就不发了,分享一下第23章 使用OpenLDAP部署目录服务很实用 下面是DHCP动态管理地址,如需深入学习请前往 https://www.linuxprobe.com/chapter- ...
- RHCSA之路(1) -- 重拾RHEL 7
去年就买了Linux就该这么学这本书,在自己电脑上和实验室里的电脑都按照书上写的配置安装好了RHEL 7系统,然后看到了第二章就被别的事情吸引了注意力就再也没碰过了.现在希望自己能专注下来,一步一步做 ...