基于opencv的直线检测(pythonC++)

提供了直线检测python与C++版本,用于检测竖直线与横线,主要流程为:图像二值化+Canny边缘检测+霍夫直线变换直线检测

一、python实现

import shutilimport osimport cv2
import numpy as npfilename = "20230525-173637.jpg"
file_ext = ".jpg"src_path = "./" + filename
dirpath = "./"
print(src_path)
# TODO: 在此处添加对图片的处理代码new_filename = filename.split('.')[0] + '_result.' + file_extnew_file_path = os.path.join(dirpath, new_filename)img_path = src_path# 读取图像
img2 = cv2.imread(img_path)
img = cv2.imread(img_path,0)lower = 25
upper = 255# 将图像二值化到指定范围内
binary_img = cv2.inRange(img, lower, upper)
#  # 显示结果
cv2.imshow('Binary Image', binary_img)
cv2.waitKey(0)
cv2.destroyAllWindows()cv2.imwrite(new_file_path,binary_img)# 边缘检测
edges = cv2.Canny(binary_img, 50, 150, apertureSize=3)# 使用霍夫直线变换检测直线
lines = cv2.HoughLinesP(edges, rho=1, theta=0.5*np.pi/180, threshold=50, minLineLength=1000, maxLineGap=80)# shutil.copy2(src_path, new_file_path)# 遍历所有直线,绘制竖直方向的直线
for line in lines:x1, y1, x2, y2 = line[0]# 计算直线的斜率# print(x2-x1)# k = (y2 - y1) / (x2 - x1)# 当斜率大于0.5时,认为是竖直方向的直线if x2 -x1 == 0 :# img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)cv2.line(img2, (x1, y1), (x2, y2), (0, 0, 255), 5)# print(6666)cv2.imwrite(new_file_path,img2)

二、C++实现

#include <iostream>
#include <string>
#include <opencv2/opencv.hpp>
#include <cmath>
const std::string file_ext = ".jpeg";
const int lower = 10;
const int upper = 255;double distance(int x1, int y1, int x2, int y2)
{// 计算两点直线距离double dx = x1 - x2;double dy = y1 - y2;return std::sqrt(dx*dx + dy*dy);
}int main()
{std::string src_path = "../1/top3.jpeg";// 读取图片// cv::Mat img = cv::imread(src_path, 0);cv::Mat img2 = cv::imread(src_path);cv::Mat img;cv::cvtColor(img2, img, cv::COLOR_BGR2GRAY);// 判断是否读取成功if (img.empty()) {std::cout << "read image failed" << std::endl;return -1;}// 将图像二值化到指定范围内cv::Mat binary_img;cv::inRange(img, lower, upper, binary_img);// 边缘检测cv::Mat edges;cv::Canny(binary_img, edges, 50, 150, 3);// 使用霍夫直线变换检测直线std::vector<cv::Vec4i> lines;cv::HoughLinesP(edges, lines, 1, 0.5*CV_PI/180, 50, 1000, 80);// 遍历所有直线,绘制竖直方向的直线bool ifLeft = false;bool iRight = false;for (auto line : lines){int x1 = line[0], y1 = line[1], x2 = line[2], y2 = line[3];// 当斜率大于0.5时,认为是竖直方向的直线if (x2 - x1 == 0){double dis = distance(x1, y1, x2, y2);if ((630 < x1 && x1 < 650) && (dis > 1000)){cv::line(img2, cv::Point(x1, y1), cv::Point(x2, y2), cv::Scalar(0, 0, 255), 5);std::cout << x1 << std::endl;ifLeft = true;// cv::imwrite(new_file_path, img2);}if ((1270 < x1 && x1 < 1290) && (dis > 1000)){cv::line(img2, cv::Point(x1, y1), cv::Point(x2, y2), cv::Scalar(0, 0, 255), 5);std::cout << x1 << std::endl;iRight = true;}}}// cv::imshow("image", img2);// cv::waitKey(0);if( ifLeft && iRight){std::cout << 2 << std::endl;return 2;}if( ifLeft && !iRight){std::cout << 1 << std::endl;return 1;}std::cout << 0 << std::endl;return 0;cv::imshow("image", img2);cv::waitKey(0);
}

cmake

# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html# Sets the minimum version of CMake required to build the native library.
project("linedetector")
cmake_minimum_required(VERSION 3.4.1)# Declares and names the project.set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fexceptions")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexceptions" )# 添加opencv
set(thirdPath ${CMAKE_SOURCE_DIR}/thirdParty)
set(OPENCV_ANDROID_SDK_PATH ${thirdPath}/opencv/)
include_directories(${OPENCV_ANDROID_SDK_PATH}/native/jni/include)
add_library(opencvSHAREDIMPORTED)
set_target_properties(opencvPROPERTIESIMPORTED_LOCATION${OPENCV_ANDROID_SDK_PATH}/native/libs/${ANDROID_ABI}/libopencv_java3.so)# 添加自定义文件
set(INTERFACE_SRC ${CMAKE_SOURCE_DIR}/src/main/cpp)
include_directories(${INTERFACE_SRC}/)file(GLOB_RECURSE INTERFACE_SRC${INTERFACE_SRC}/linedetector.cpp)add_library(linedetector SHARED ${INTERFACE_SRC})find_library( # Sets the name of the path variable.log-lib# Specifies the name of the NDK library that# you want CMake to locate.log)# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.target_link_libraries( # Specifies the target library.linedetectoropencvjnigraphics# Links the target library to the log library# included in the NDK.${log-lib})

编译运行:

mkdir build
cd build
cmake ..
make
./linedetector

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

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

相关文章

F-Droid:开源Android应用的宝库

F-Droid&#xff1a;开源Android应用的宝库 引言 F-Droid是一个开源应用程序存储库&#xff0c;旨在为安卓用户提供自由、隐私和安全的应用程序。它最初于2010年由Ciaran Gultnieks创建&#xff0c;因为他认为Google Play Store上的应用程序不够透明和安全。F-Droid的目标是为…

Web3与环保:区块链如何推动可持续发展

随着气候变化和环境问题日益严峻&#xff0c;社会对可持续发展的需求变得愈发迫切。在这个背景下&#xff0c;Web3技术和区块链崭露头角&#xff0c;成为推动可持续发展的关键力量。本文将深入探讨Web3技术如何与环保理念相结合&#xff0c;引领我们迈向更加可持续的未来。 1. …

AtCoder Beginner Contest 336 D - Pyramid

题目链接 题意&#xff1a;就是给你一个长为n的序列&#xff0c;让你通过两种不限次数的操作 使其变为金字塔序列&#xff0c;(a1<a2<ak>ak-1>ak-2...>an) 两种操作分别是1&#xff1a;让任何一个数减一&#xff1b;2&#xff1a;去掉队头队尾 其实我们想这和…

每日一题——LeetCode1200.最小绝对差

方法一 个人方法 排序一次遍历&#xff1a; 最小差值一定是出现在大小相邻的两个元素之间&#xff0c;所以将数组从小到大排序 循环求两元素之间的差值&#xff0c;先假设当前差值为最小差值&#xff0c;先往res数组里面push数据&#xff0c;当碰到更小差值的时候&#xff0c…

VS 中调用调试DLL库的方法

前提条件&#xff1a; 1、当前代码是最新的&#xff0c;并且编译成dll的库有程序使用。 2、打开运行dll库的程序。 配置步骤&#xff1a; 1、使用VS打开要调试的dll库项目。 2、点击调试菜单展开调试菜单。 3、点击附加到进程&#xff0c;弹出配置框。 4、在配置框中选…

学习笔记-数据库概念介绍

一.数据库概述 1.数据库: 存储数据的仓库,本质是一个文件系统. 用户可以对数据库中的数据进行 增加,修改,删除以及查询操作 2.特点 可以结构化存储大量的数据可以有效的保持数据的一致性,完整性读写效率高 3.常用数据库 二.数据库分类及其常用 关系型数据库 指的是二维表格…

【51单片机系列】51单片机的中断系统使用总结一

本文是在学习51单片机的中断系统的简单性总结&#xff0c;着重于51单片机的中断系统的工作原理及如何使用。 文章目录 一、中断原理简单介绍二、 外部中断相关介绍2.1 与外部中断相关的寄存器2.2、外部中断0使用示例2.3、外部中断1使用示例 三、定时器中断相关介绍3.1、51单片机…

基于Ubuntu22.04部署生产级K8S集群v1.27(规划和核心组件部署篇)

本文档主要根据k8s官网文档和其插件的官网文档&#xff0c;参考部分他人优秀经验&#xff0c;在实际操作中逐渐完成&#xff0c;比较详尽&#xff0c;适合在境内学习者和实践者参考。 实操环境基于VMware Workstation 17 pro&#xff0c;采用ubuntu22.04操作系统&#xff08;有…

链接全域直播产业经济,天府锋巢直播产业基地10层正式起航

100㎡-400㎡多种类型的办公户型可选 精装全包 拎包入驻 【天府锋巢直播基地】 由德商产投与无锋科技联袂打造 坐落于天府新区核心区域科学城板块 包含电商直播、娱乐直播、跨境直播 多种直播业态的全域直播基地 基地【10层】于12月初全面竣工 招&#xff5c;商 &#xff5c;火&…

中小企业如何做好信息化规划?

中小企业需不需要做信息化规划&#xff1f;什么时候做信息化规划比较好&#xff1f; 企业的信息化规划&#xff0c;一定是越早越好&#xff0c;越快越好。 因为信息化是一个过程&#xff0c;不是一个结果&#xff0c;它不是一天完成的事情&#xff0c;而是贯穿着企业经营管理…

鸿蒙应用开发学习:让page页面强制横屏

一、学习做了个适合横屏的页面但进入页面后是竖屏显示的 前几天在B站上跟着 黑马程序员的 HarmonyOS4.0开发应用教学视频学习了显式动画&#xff08;animateTo&#xff09;和属性动画&#xff08;animation&#xff09;功能&#xff0c;并参照教学视频的内容做了个小鱼动画。…

瑞_Java开发手册_(五)MySQL数据库

文章目录 (一) 建表规约(二) 索引规约(三) SQL 语句(四) ORM 映射附&#xff1a;雪花算法&#xff08;Java&#xff09; &#x1f64a;前言&#xff1a;本文章为瑞_系列专栏之《Java开发手册》的MySQL数据库篇&#xff0c;主要介绍建表规约、索引规约、SQL语句、ORM映射。由于博…

力扣hot100 路径总和Ⅲ dfs 前缀和 一题双解 超全注释

Problem: 437. 路径总和 III 思路 树的遍历 DFS 一个朴素的做法是搜索以每个节点为根的&#xff08;往下的&#xff09;所有路径&#xff0c;并对路径总和为 targetSumtargetSumtargetSum 的路径进行累加统计。 使用 dfs1 来搜索所有节点&#xff0c;复杂度为 O(n)O(n)O(n)&am…

CPU 工作原理

随笔记录 目录 1. 简单介绍 2. CPU 工作原理详细介绍 2.1. 取值 2.2. 译码 2.3. 执行 2.4. 写回 1. 简单介绍 CPU(中央处理器)是一台计算机的主要组成部分&#xff0c;它承担着执行计算机指令和控 制计算机运行的任务。CPU 工作原理简单概述&#xff1a; 取值 --> 译…

【温故而知新】HTML链接a标签/图像img标签

文章目录 一、概念二、链接三、图像 一、概念 HTML&#xff08;HyperText Markup Language&#xff0c;超文本标记语言&#xff09;是用于创建网页的标准标记语言。它被用来描述网页的结构和内容&#xff0c;并且是网页浏览器能够解析和渲染网页的基础。HTML5 是 HTML 的最新版…

1.IHRM人力资源后台 - 项目搭建

IHRM人力资源 - 项目搭建 文章目录 IHRM人力资源 - 项目搭建一、项目搭建1.1 项目搭建1.2 项目目录1.2.1 src 目录 1.3 App.vue 根组件解析1.4 基础设置 settings.js1.5 导航守卫 permission.js1.6 VUEX 二、 图标使用2.1 图标使用2.2 Icon 图标的解析 一、项目搭建 1.1 项目搭…

关于中考英语的一些刷题建议

怎么提高英语成绩&#xff1f; 对于英语&#xff0c;我个人认为只需要会刷题&#xff0c;多刷题就能提高&#xff0c;至于你们老师布置的关于直接背单词/语法&#xff0c;我认为提高效果并不是很明显。 为什么你从初一写到现在初三刷了这么多题&#xff0c;英语成绩还是没提高呢…

HiDataPlus 3.3.2-005 搭建(个人的一点心得体会 x86 平台)

HDP 集群搭建 前置安装 yum -y install createrepo yum install -y lrzsz yum install -y wget yum install -y vim修改当前集群机器的主机名 hostnamectl set-hostname XXX​ 这里的 XXX 就是要设置的当前机器的主机名称。主机名称是集群唯一的&#xff0c;一定不要重复&am…

经典文献阅读之--TwinLiteNet(可行驶区域和车道分割的高效轻量级模型)

0. 简介 对于自动驾驶来说语义分割是自动驾驶中理解周围环境的一项常见任务。可行驶区域分割和车道检测对于道路上安全且高效的导航尤为重要。为了满足自动驾驶汽车中可行驶区域和车道分割的高效轻量级&#xff0c;《TwinLiteNet: An Efficient and Lightweight Model for Dri…

项目计划书

项目开发计划包括项目描述、项目组织、成本预算、人力资源估算、设备资源计划、沟通计划、采购计划、风险计划、项目过程定义及项目的进度安排和里程碑、质量计划、数据管理计划、度量和分析计划、监控计划和培训计划等。 软件全配套资料获取&#xff1a;软件开发全套资料-CSDN…