图像练习-计算平行线距离opencv(03)

原图 

 

//对输入图像进行细化
cv::Mat ThinLine(const cv::Mat& matsrc, const int& iterations)
{//CvSize size = cvGetSize(src);cv::Mat dst = matsrc.clone();//拷贝一个数组给另一个数组int _iwidth = dst.cols;int _iheight = dst.rows;int n = 0, i = 0, j = 0;for (n = 0; n < iterations; n++){cv::Mat temp = dst.clone();for (i = 0; i < temp.rows; i++){for (int j = 0; j < temp.cols; j++){if ((*temp.ptr<uchar>(i, j)) == 1){int ap = 0;int p2 = (i == 0) ? 0 : (*temp.ptr<uchar>(i - 1, j));int p3 = (i == 0 || j == _iwidth - 1) ? 0 : (*temp.ptr<uchar>(i - 1, j + 1));if (p2 == 0 && p3 == 1){ap++;}int p4 = (j == _iwidth - 1) ? 0 : (*temp.ptr<uchar>(i, j + 1));if (p3 == 0 && p4 == 1){ap++;}int p5 = (i == _iwidth - 1 || j == _iwidth - 1) ? 0 : (*temp.ptr<uchar>(i + 1, j + 1));if (p4 == 0 && p5 == 1){ap++;}int p6 = (i == _iwidth - 1) ? 0 : (*temp.ptr<uchar>(i + 1, j));if (p5 == 0 && p6 == 1){ap++;}int p7 = (i == _iwidth - 1 || j == 0) ? 0 : (*temp.ptr<uchar>(i + 1, j - 1));if (p6 == 0 && p7 == 1){ap++;}int p8 = (j == 0) ? 0 : (*temp.ptr<uchar>(i, j - 1));if (p7 == 0 && p8 == 1){ap++;}int p9 = (i == 0 || j == 0) ? 0 : (*temp.ptr<uchar>(i - 1, j - 1));if (p8 == 0 && p9 == 1){ap++;}if (p9 == 0 && p2 == 1){ap++;}if ((p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9) > 1 && (p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9) < 7){if (ap == 1){if (p2 * p4 * p8 == 0){if (p2 * p6 * p8 == 0){(*dst.ptr<uchar>(i, j)) = 0;}}}}}}}}//将二值图像转换成灰度,以便显示for (i = 0; i < dst.rows; i++){for (j = 0; j < dst.cols; j++){if ((*dst.ptr<uchar>(i, j)) == 1){(*dst.ptr<uchar>(i, j)) = 255;}else{(*dst.ptr<uchar>(i, j)) = 0;}}}return dst;
}void LineDistance()
{cv::Mat src = cv::imread("平行线求距离.png", cv::IMREAD_COLOR);cv::Mat gray;cv::cvtColor(src, gray, cv::COLOR_BGR2GRAY);cv::Mat thre;cv::threshold(gray, thre, 128, 1, cv::THRESH_BINARY_INV);//第一步 对图像中的直线进行细化cv::Mat line = ThinLine(thre, 50);//第二步  提取直线的轮廓坐标std::vector<std::vector<cv::Point>> contours;cv::findContours(line, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);cv::Mat show = src.clone();cv::drawContours(show, contours, -1, cv::Scalar(255));//直线拟合 	//拟合结果为一个四元素的容器,比如Vec4f - (vx, vy, x0, y0)//其中(vx, vy) 是直线的方向向量 (x0, y0) 是直线上的一个点cv::Vec4d l0;cv::fitLine(contours[0], l0, cv::DIST_L2, 0, 0.01, 0.01);//拟合方法采用最小二乘法double cos_theta0 = l0[0];double sin_theta0 = l0[1];double x0 = l0[2], y0 = l0[3];double k0 = sin_theta0 / cos_theta0;double b0 = y0 - k0 * x0;printf("line0: y = %f * x + %f \n", k0 * 180.0 / CV_PI, b0);double x = 0;double y = k0 * x + b0;cv::Vec4d l1;//拟合方法采用最小二乘法cv::fitLine(contours[1], l1, cv::DIST_L2, 0, 0.01, 0.01);double cos_theta1 = l1[0];double sin_theta1 = l1[1];double x1 = l1[2], y1 = l1[3];double k1 = sin_theta1 / cos_theta1;double b1 = y1 - k1 * x1;printf("line1: y = %f * x + %f \n", k1 * 180.0 / CV_PI, b1);//第四部  计算两条直线之间的距离 公式是: |b1 - b0| / sqrt(A * A + B * B)double A = k0;double B = 1.0;double 	dis = abs(b1 - b0) / sqrt(A * A + B * B);printf("dis is %f \n", dis);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/141442.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【二分图染色】ARC 165 C

C - Social Distance on Graph 题意&#xff1a; 思路&#xff1a; 首先考虑一条链的情况&#xff0c;注意到如果两条相邻的边加起来 < x&#xff0c;一定不行 这个结论推广到图也是一样的 同时注意到 x 具有单调性&#xff0c;考虑对 x 二分 在check时进行二分图染色 …

三维模型3DTile格式轻量化压缩在移动智能终端应用方面的重要性分析

三维模型3DTile格式轻量化压缩在移动智能终端应用方面的重要性分析 随着移动智能终端设备的不断发展和普及&#xff0c;如智能手机、平板电脑等&#xff0c;以及5G网络技术的推广应用&#xff0c;使得在这些设备上频繁使用三维地理空间数据成为可能。然而&#xff0c;由于这类数…

物联网、工业大数据平台 TDengine 与苍穹地理信息平台完成兼容互认证

当前&#xff0c;在政府、军事、城市规划、自然资源管理等领域&#xff0c;企业对地理信息的需求迅速增加&#xff0c;人们需要更有效地管理和分析地理数据&#xff0c;以进行决策和规划。在此背景下&#xff0c;“GIS 基础平台”应运而生&#xff0c;它通常指的是一个地理信息…

MySQL-树型结构数据查询

表结构 进行树形结构查询&#xff0c;利用特殊语法进行操作 with recursive t as(select parent_id , business_namefrom business_line where id 21union allselect a.parent_id, a.business_namefrom business_line a join t on a.id t.parent_id) select business_name f…

20-SpringCloudAlibaba-1

一 Spring Cloud Alibaba简介 什么是Spring Cloud Alibaba Spring Cloud Alibaba致力于提供微服务开发的一站式解决方案。 此项目包含开发分布式应用微服务的必需组件&#xff0c;方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。 为什么要推出Sp…

广东MES系统实现设备管理的方法与功能

在生产车间中&#xff0c;可以借助MES系统来完成设备管理。下面来看看借助MES系统实现设备管理比较常见的具体方法与功能&#xff1a; 1.在线监控和数据采集&#xff1a;MES系统能够与车间设备相连接&#xff0c;在线实时监控设备的运行状态和运行指标。凭借传感器、物联网产品…

腾讯云cvm云硬盘扩容

过去一直记得腾讯云的系统盘扩容,关于系统盘的扩容直接点资源调整-云硬盘扩容 系统盘扩容后就可以直接使用的&#xff1f; 但是现在操作了发现vda 200G 但是现在vda1不能自动扩容了&#xff1f; 腾讯云cvm云硬盘扩容 先看一眼官方文档吧&#xff1a;在线扩展系统盘分区及文…

php实现分页功能跳转和ajax方式实现

实现效果 准备工作 创建数据表和导入测试数据 CREATE TABLE users ( id int(10) unsigned NOT NULL AUTO_INCREMENT, username varchar(30) DEFAULT NULL COMMENT 账号, email varchar(30) DEFAULT NULL COMMENT 密码, PRIMARY KEY (id) ) ENGINEMyISAM AUTO_INCREM…

GiliSoft USB Lock v10.5.0 电脑USB设备管控软件

网盘下载 软件功能特性 禁止USB / SD驱动器 禁用从USB / SD磁盘读取&#xff0c;禁用写入USB / SD磁盘&#xff0c;阻止非系统分区。它不允许任何类型的USB / SD驱动器访问您的计算机&#xff0c;除非您授权它或它已在可信设备白名单。 CD锁&#xff0c;块媒体和蓝光光盘 禁用…

LeetCode每日一题:1993. 树上的操作(2023.9.23 C++)

目录 1993. 树上的操作 题目描述&#xff1a; 实现代码与解析&#xff1a; 模拟 dfs 原理思路&#xff1a; 1993. 树上的操作 题目描述&#xff1a; 给你一棵 n 个节点的树&#xff0c;编号从 0 到 n - 1 &#xff0c;以父节点数组 parent 的形式给出&#xff0c;其中 p…

2023-油猴(Tampermonkey)脚本推荐

2023-油猴&#xff08;Tampermonkey&#xff09;脚本推荐 知乎增强 链接 https://github.com/XIU2/UserScript https://greasyfork.org/zh-CN/scripts/419081 介绍 移除登录弹窗、屏蔽首页视频、默认收起回答、快捷收起回答/评论&#xff08;左键两侧&#xff09;、快捷回…

CeresPCL ICP精配准(点到面)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 ICP算法总共分为6个阶段,如下图所示: (1)挑选发生重叠的点云子集,这一步如果原始点云数据量比较巨大,一般会对原始点云进行下采样操作。 (2)匹配特征点。通常是距离最近的两个点,当然这需要视评判的准则而…

基于微信小程序的医院门诊体检预约管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

uni-app:实现页面效果1

效果 代码 <template><view><view class"add"><image :src"add_icon" mode""></image></view><view class"container_position"><view class"container_info"><view c…

使用datax将数据从InfluxDB抽取到TDengine过程记录

1. 编写InfluxDB数据查询语句 select time as ts,device as tbname, ip,device as district_code from "L2_CS" limit 1000 2. 创建TDengine表 create database if not exists sensor; create stable if not exists sensor.water(ts timestamp, ip varchar(50), …

怎样快速打开github.com

1访问这个网站很慢是因为有DNS污染&#xff0c;被一些别有用心的人搞了鬼了&#xff0c; 2还有一个重要原因是不同的DNS服务器解析的速度不一样。 1 建议设置dns地址为114.114.114.114.我觉得假设一个县城如果有一个DNS服务器的话&#xff0c;这个服务器很可能不会存储…

【STM32】IAP升级 预备知识

IAP&#xff08;In Application Programming&#xff09;简介 Flash够大的情况下&#xff0c;上电后的程序通过修改 MSP 的方式&#xff0c;可以在一块Flash上存在多个功能差异的程序。 IAP是为了在执行正常功能前&#xff0c;为了升级功能&#xff0c;提前运行的一段程序。这…

【【萌新的SOC学习之绪论】】

萌新的SOC学习之绪论 Vitis 统一软件平台的前身为 Xilinx SDK&#xff0c;从 Vivado 2019.2 版本开始&#xff0c;Xilinx SDK 开发环境已统一整合 到全功能一体化的 Vitis 中。Vitis 开发平台除了启动方式、软件界面、使用方法与 SDK 开发平台略有区别&#xff0c; 其他操作几…

LLM-TAP随笔——语言模型训练数据【深度学习】【PyTorch】【LLM】

文章目录 3、语言模型训练数据3.1、词元切分3.2、词元分析算法 3、语言模型训练数据 数据质量对模型影响非常大。 典型数据处理&#xff1a;质量过滤、冗余去除、隐私消除、词元切分等。 训练数据的构建时间、噪音或有害信息情况、数据重复率等因素都对模型性能有较大影响。训…

代数——第2章——群

第 2 章 群(Groups) II est peu de notions en mathematiques qui soient plus primitives que celle de loi de composition. (数学中很少有比合成律更原始的概念了。) --------------------------------------------------------Nicolas Bourbaki 2.1 合成律(LAWS OF CO…