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,不过其实写到这个部分对计算机视觉算法有所了解的应该可以做到用什么查什么了,所以后面可能会更的慢一点吧,既然开了新坑,还是机器学习更有研究价值吧... 图像在内存中的存 ...
随机推荐
- css伪类及伪元素用法
注:该表引自W3School教程 伪元素的分类及作用: 接下来让博主通过一些生动的实例(之前的作业或小作品)来说明几种常用伪类的用法和效果,其他的读者可以自己尝试: :active 大致效果为用鼠标 ...
- docker创建镜像及push镜像出错问题
docker build 出错 Got permission denied while trying to connect to the Docker daemon socket at unix:/ ...
- 网址导航18B
[名站] 百度 网易 腾讯 新华 中新 凤凰 [新闻] 联合早报 南方周末 澎湃新闻 [系统] 宋永志 蒲公英 技术员 秋叶系统 装机网 系统之家 [软件] 星愿浏览器 暴风激活 贱人工具箱 微P ...
- C# 互通操作 (二)基础知识1
[DllImport("user32.dll", EntryPoint = "MessageBox")] public static extern int De ...
- Asp.net Zero 应用实战-最初部署问题
此时用的是aspnet-zero-core-4.3.0 1.前两天vs2017刚刚最新升级了,打开后就报错,然后就根据提示把每个项目文件中添加了 <PropertyGroup> <E ...
- Scikit-learn 安装
Scikit-Learn 3 pip 安装 如果安装了Python,没有安装pip,使用Windows + R,输入cmd,回车打开命令行,输入 python -m pip install -U pi ...
- 字符串API练习三则
(1)按照Ascii码字典的顺序排列字符串.核心API:int compareTo(String),若大于则返回1,小于返回-1,等于返回0. class StringArray { static v ...
- 关于numpy中的函数return中加入字符串类型数据后,小数点精度变化
weekdays.pyimport numpy as npfrom datetime import datetimedef datestr2num(s): return datetime.strpti ...
- String Match
Finding length of longest common substring /*Finding length of longest common substring using DP * * ...
- pandas库的学习笔记
Environment pandas 0.21.0 python 3.6 jupyter notebook 开始 习惯上,我们导入如下: import pandas as pd import nump ...