很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录。

代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tree/master/OpenCVTest

效果

代码

#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp> // http://blog.csdn.net/zhaocj/article/details/50281537 int houghLineDetection()
{
// 加载原图像
cv::Mat src = cv::imread("../Image/houghline2.jpg");
if (src.empty()) {
puts("原图像读取失败!!!");
return -1;
}
cv::Mat gray(src.size(), CV_8UC1); // 原图的灰度图像
cv::cvtColor(src, gray, CV_BGR2GRAY); cv::Mat edge(src.size(), CV_8UC1); // 边缘图像
cv::Mat dst(src.size(), src.type());// 绘制直线的目标图像、
cv::cvtColor(gray, dst, CV_GRAY2BGR); // 从灰度图转过来,便于后面绘制红色的线条 // 进行Canny边缘检测
cv::Canny(gray, edge, 50, 200, 3); #if 0
// 定义输出数组,用于存储直线的角度和距离这两个变量
std::vector<cv::Vec2f> lines;
// 距离分辨率为1,角度分辨率为π/180,阈值为215
// 阈值的选取直接影响到输出直线的数量
cv::HoughLines(edge, lines, CV_HOUGH_PROBABILISTIC,
CV_PI / 180.0,215,0,0);
// 画直线
for (size_t i = 0; i < lines.size(); ++i) {
// 提取出距离和角度
float rho = lines[i][0];
float theta = lines[i][1]; // 定义两个点,确定一条直线
cv::Point p1, p2;
// 计算得到两个点的坐标
// (ρcosθ-1000sinθ,ρsinθ+1000cosθ),(ρcosθ+1000sinθ,ρsinθ-1000cosθ)
double a = cos(theta);
double b = sin(theta);
double x0 = a*rho;
double y0 = b*rho;
p1.x = cvRound(x0 + 1000 * (-b));
p1.y = cvRound(y0 + 1000 * a);
p2.x = cvRound(x0 - 1000 * (-b));
p2.y = cvRound(y0 - 1000 * a);
// 在灰度图上画宽度为2的红线
cv::line(dst, p1, p2, cv::Scalar(0, 0, 255), 2, 8);
}
#else
std::vector<cv::Vec4i> lines;
cv::HoughLinesP(edge, lines, CV_HOUGH_PROBABILISTIC,
CV_PI / 180.0, 80, 30, 10);
for (size_t i = 0; i < lines.size(); ++i) {
cv::line(dst, cv::Point(lines[i][0], lines[i][1]),
cv::Point(lines[i][2], lines[i][3]), cv::Scalar(0, 0, 255), 2, 8);
} #endif // 创建窗口显示原图和目标图
cv::namedWindow("src");
cv::namedWindow("dst");
cv::imshow("src", src);
cv::imshow("dst", dst);
cv::imshow("edge", edge); // 等待按键退出
cv::waitKey();
return 0;
}

OpenCV学习代码记录——Hough线段检测的更多相关文章

  1. OpenCV学习代码记录——轮廓(contour)检测

    很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tr ...

  2. OpenCV学习代码记录——人脸检测

    很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tr ...

  3. OpenCV学习代码记录—— Snake轮廓

    很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tr ...

  4. OpenCV学习代码记录——canny边缘检测

    很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tr ...

  5. Opencv学习笔记------Harris角点检测

    image算法测试iteratoralgorithmfeatures 原创文章,转载请注明出处:http://blog.csdn.net/crzy_sparrow/article/details/73 ...

  6. python 设计模式学习代码记录

    @工厂模式class Beijing: def printreslut(self): print("ok") class Shanghai: def printreslut(sel ...

  7. OpenCV 学习笔记03 直线和圆检测

    检测边缘和轮廓不仅重要,还经常用到,它们也是构成其他复杂操作的基础. 直线和形状检测与边缘和轮廓检测有密切的关系. 霍夫hough 变换是直线和形状检测背后的理论基础.霍夫变化是基于极坐标和向量开展的 ...

  8. OpenCV学习系列(一) Mac下OpenCV + xcode人脸检测实现

    # OpenCV学习系列(一) Mac下OpenCV + xcode人脸检测实现 [-= 博客目录 =-] 1-学习目标 1.1-本章介绍 1.2-实践内容 1.3-相关说明 2-学习过程 2.1-环 ...

  9. OpenCV学习 物体检测 人脸识别 填充颜色

    介绍 OpenCV是开源计算机视觉和机器学习库.包含成千上万优化过的算法.项目地址:http://opencv.org/about.html.官方文档:http://docs.opencv.org/m ...

随机推荐

  1. android R.layout 中找不到已存在的布局文件

    在R.layout.test文件时,总是找不到您想要的文件,可是它明明就在layout文件下面,而且在R.Java中也已经生成了,那么找不到的原因就是你导入了Android.R的包,这样你永远找不到你 ...

  2. Java 线程与锁

    Synchronization synchronized语法可以获取锁, 当其他线程持有锁的时候该线程想要获取锁将会进入等待状态, 直到没有其他线程持有该锁 显示使用 synchronized (lo ...

  3. 使用idea 在springboot添加本地jar包的方法

    原文地址;https://blog.csdn.net/huxiaodong1994/article/details/80702278 1.首先在与src同级的目录下新建一个lib目录,然后将本地jar ...

  4. 支付宝 iphone6 指纹验证失败

    重启 iphone6  就可以了. 再次打开 支付宝 那个 指纹功能,就有一个弹出框 可以按指纹了.

  5. iOS:移动端“用户反馈和客服”的几个平台SDK的介绍

    简单阐述: 用户反馈功能几乎是每个app都有的一个功能点,通过反馈功能实现与用户的连接.沟通,随时随地收集用户意见反馈和Bug报告,即时和用户保持沟通,在一定程度上提升了app的竞争力.而给app评分 ...

  6. 2、Python特征

    Python特征 Python编程语言中的定位 脚本语言 高阶动态编程语言 简单易学 Python是一种代表简单主义思想的语言.Python的这种伪代码本质是它最大的优点之一.它使你能够专注于解决问题 ...

  7. Sudoku Solver leetcode java

    题目: Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated b ...

  8. Linux下配置nfs并远程挂载

    nfs是网络文件系统,允许一个节点通过网络访问远程计算机的文件系统,远程文件系统可以被直接挂载到本地,文件操作和本地没有区别,如果是局域网的nfs那么io的性能也可以保证,下面就以CentOS 7.x ...

  9. List 集合的交集

    private void Test() { List<string> lsA = new List<string>(); lsA.Add("A"); lsA ...

  10. 在centos7.4上安装mysql5.5

    from: https://www.digitalocean.com/community/tutorials/how-to-install-mysql-on-centos-7