OpenCV特征检测(1)检测图像中的线段的类LineSegmentDe()的使用

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

检测图像中线段的类.。

遵循在 285中描述的算法。

函数原型1

绘制两组线,一组用蓝色,一组用红色,并计算非重叠(不匹配)的像素。

cpp 复制代码
virtual int cv::LineSegmentDetector::compareSegments
(
	const Size & 	size,
	InputArray 	lines1,
	InputArray 	lines2,
	InputOutputArray 	image = noArray() 
)		

参数1

  • 参数size:找到 lines1 和 lines2 的图像的大小。
  • 参数lines1:需要绘制的第一组线段。它们以蓝色显示。
  • 参数lines2:第二组线段。它们以红色显示。
  • 参数image:可选的图像,在该图像上绘制线段。图像应该是彩色的(3通道),以便 lines1 和 lines2 能够以上述颜色绘制。

函数原型2

在一个输入图像中查找线条

cpp 复制代码
virtual void cv::LineSegmentDetector::detect	
(
	InputArray 	image,
	OutputArray 	lines,
	OutputArray 	width = noArray(),
	OutputArray 	prec = noArray(),
	OutputArray 	nfa = noArray() 
)		

参数2

  • 参数image:一个灰度(CV_8UC1类型)输入图像。如果只需要选择一个感兴趣区域(ROI),可以使用:lsd_ptr->detect(image(roi), lines, ...); 并且需要更新 lines 向量,加上偏移量 lines += Scalar(roi.x, roi.y, roi.x, roi.y);

  • 参数ilines:由 Vec4f 类型元素组成的向量,指定了一条线段的起始点和终点。其中 Vec4f 的格式为 (x1, y1, x2, y2),点1为起点,点2为终点。返回的线段是严格根据梯度方向排列的。

  • 参数iwidth:一个向量,包含了发现线段所在区域的宽度。例如,线段的宽度。

  • 参数iprec:一个向量,包含了发现线段的精确度。

  • 参数infa:一个包含在线段区域内误报数量的向量,精确到10%。数值越大,对数意义上检测得越好。

    • -1 对应于平均有10个误报;
    • 0 对应于平均有1个误报;
    • 1 对应于平均有0.1个误报; 这个向量仅当对象类型设置为 LSD_REFINE_ADV 时才会计算。

函数原型3

在给定的图像上绘制线段

cpp 复制代码
virtual void cv::LineSegmentDetector::drawSegments	
(
	InputOutputArray 	image,
	InputArray 	lines 
)	

参数3

  • 参数image:这指的是线条将要在其上绘制的图像。该图像应该大于或等于找到线条的图像的尺寸。
  • 参数lines:这是一个需要绘制的线条的向量(集合)。

代码示例

cpp 复制代码
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/line_descriptor/descriptor.hpp>
#include <opencv2/ximgproc.hpp>
#include <iostream>

int main(int argc, char** argv)
{
    // 加载图像
    cv::Mat img = cv::imread("/media/dingxin/data/study/OpenCV/sources/images/building.png",cv::IMREAD_GRAYSCALE);
    if (img.empty())
    {
        std::cout << "Error loading image." << std::endl;
        return -1;
    }
 // 创建用于绘制线段的新图像
    cv::Mat lsd_img = img.clone();

    // 创建 LineSegmentDetector
    cv::Ptr<cv::LineSegmentDetector> lsd = cv::createLineSegmentDetector();

    // 检测线段
    std::vector<cv::Vec4i> lineSegments;
    lsd->detect(img, lineSegments);

    // 遍历并绘制每个线段
    for (const auto& ls : lineSegments)
    {
        cv::Point pt1(ls[0], ls[1]);
        cv::Point pt2(ls[2], ls[3]);
        cv::line(lsd_img, pt1, pt2, cv::Scalar(0, 255, 0), 2); // 绘制绿色线条
    }

    // 显示结果图像
    cv::imshow("original image", img);
    cv::imshow("Line Segments", lsd_img);
    cv::waitKey(0);

    return 0;
}

运行结果

原始图:

画线段图:

相关推荐
这张生成的图像能检测吗4 分钟前
(论文速读)DI-CDM:微调条件扩散模型在结构健康监测中的损伤成像
人工智能·lora·扩散模型·高分辨率成像·结构健康监测
阿伟玩不懂6 分钟前
接入第一个 MCP Server:让 AI 自己看你的数据库
ide·人工智能
中电金信7 分钟前
中电金信参编的团体标准《商业银行应用程序接口治理能力要求》正式发布
大数据·运维·人工智能
Data-Miner12 分钟前
怎么用AI给Excel去重?先核对这7条再下手,别让好数据被删错:数以轻舟方案解析
人工智能·excel
小宋102113 分钟前
MCP 工具也有供应链风险:注册中心、签名校验、版本锁定与白名单
开发语言·网络·人工智能·php
悟天特斯14 分钟前
AI驱动的楼宇节能:从经验粗放到数据精准的转型路径
人工智能·物联网
IT古董20 分钟前
AI 资讯日报|2026年9月19日:模型迭代进入高频节奏,国产全模态与算力持续突破,AI应用与具身智能加速落地
人工智能
2601_9623807626 分钟前
节气民俗科普视频的 AI 动效分镜工作流:从文案到成片怎么做
人工智能·音视频
启雀AI33 分钟前
培训管理系统的 AI 智能陪练完整功能逻辑,以家电门店销售为例的剧本框架
人工智能·ai·软件需求·培训系统·培训平台
hunteritself36 分钟前
夯爆了!Qoder 狂肝 2 小时,293 个测试全绿,Credits 一分没扣
前端·人工智能·chrome·深度学习·机器学习