基于opencv的直线检测(python&C++)

这篇具有很好参考价值的文章主要介绍了基于opencv的直线检测(python&C++)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

一、python实现

import shutil

import os

import cv2
import numpy as np

filename = "20230525-173637.jpg"
file_ext = ".jpg"

src_path = "./" + filename
dirpath = "./"
print(src_path)
# TODO: 在此处添加对图片的处理代码

new_filename = filename.split('.')[0] + '_result.' + file_ext

new_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(opencv
        SHARED
        IMPORTED)
set_target_properties(opencv
        PROPERTIES
        IMPORTED_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.
        linedetector
        opencv
        jnigraphics

        # Links the target library to the log library
        # included in the NDK.
        ${log-lib})

编译运行:文章来源地址https://www.toymoban.com/news/detail-796095.html

mkdir build
cd build
cmake ..
make
./linedetector

到了这里,关于基于opencv的直线检测(python&C++)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 霍夫变换直线检测算法实现OpenCV(C++)

    一、原理 对于霍夫变换的原理这里就不进行描述啦,感兴趣的可以自行搜索。也可以看知乎上面的这篇贴文通俗易懂理解——霍夫变换原理。 二、算法代码 三、效果测试 测试代码 上述代码中的drawLine()函数是《OpenCV4快速入门》一书的代码清单 7-2中的原函数,只用于画线。

    2024年02月05日
    浏览(45)
  • 【OpenCv • c++】几何检测 —— 霍夫变换 | 霍夫直线检测 | 霍夫线变化

    🚀 个人简介:CSDN「 博客新星 」TOP 10 , C/C++ 领域新星创作者 💟 作    者: 锡兰_CC ❣️ 📝 专    栏: 【OpenCV • c++】计算机视觉 🌈 若有帮助,还请 关注➕点赞➕收藏 ,不行的话我再努努力💪💪💪

    2024年02月06日
    浏览(39)
  • 【OpenCV】cv2.HoughLines()霍夫直线检测

    霍夫直线检测(Hough Line Transform)是一种在图像中检测直线的经典算法。它通过将二维图像空间中的点映射到极坐标空间中,将直线检测问题转化为在参数空间中找到交点的问题。 原理: 对于图像空间中的每个边缘点,计算其对应在极坐标空间中可能的直线。 极坐标空间中

    2024年02月05日
    浏览(55)
  • OpenCV 笔记(17):轮廓的椭圆拟合、直线拟合

    轮廓的 椭圆拟合 是指用椭圆来近似轮廓的形状。当这个椭圆的长轴和短轴相等时,它就是一个圆。 椭圆拟合的基本思路是:对于给定平面上的一组样本点,寻找一个椭圆,使其尽可能接近这些样本点。也就是说,将图像中的一组数据以椭圆方程为模型进行拟合,使某一椭圆

    2024年01月19日
    浏览(40)
  • python+openCV (入门级)车道线检测 学习笔记

    本文使用python+openCV 用到的算法: 高斯滤波 Canny边缘检测 ROI和mask 霍夫变换 离群值过滤 最小二乘法拟合 win+x选择运行,然后输入cmd 输入 pip install opencv-python 等待安装 在IDLE中新建脚本.py文件,输入 import cv2 ,如果无报错即为安装成功。 再输入 print(cv2.__version__) 可查看openCV版本

    2023年04月10日
    浏览(33)
  • 基于opencv的简单人脸检测(python)

            OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它由一系列的C函数和少量C++类构成,同时提供Python、Java和MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。         在windows系统下,建议使用python的包安

    2024年01月22日
    浏览(42)
  • Python基于OpenCV的实时疲劳检测

    2.png 3.png 1)方法 与用于计算眨眼的传统图像处理方法不同,该方法通常涉及以下几种组合: 1、眼睛定位。 2、阈值找到眼睛的白色。 3、确定眼睛的“白色”区域是否消失了一段时间(表示眨眼)。 相反,眼睛长宽比是一种更为优雅的解决方案,它涉及基于眼睛面部轮廓之

    2024年02月03日
    浏览(53)
  • python+opencv_my图像边缘检测笔记1

    一阶微分算子边缘检测算法 1、Roberts算子 适合处理声噪较低的图片,缺点:对图片的定位不太准,提取的边缘线条比较粗;通过cv2.filte(src,ddepth,kernel,[dst[,anchor,[delta[,borderType]]])实现卷积运算; 垂直方向w1与水平方向w2 ddepth:图像深度:图像深度是指图像中每个像素的颜色表示

    2024年04月09日
    浏览(37)
  • 基于Opencv+python的车流量检测项目

    目录 项目介绍 整体流程 调试环境 项目流程 1.预处理 2.汽车识别——去背景算法(KNN/MOG2) 3.统计车流量数目 结尾 源代码 测试视频资料 流程图 本次项目主要采用了传统视觉的方法,对车道车流实现检测,能较为准确的识别出来车道上的车辆数目。由于传统视觉算法本身的

    2024年02月05日
    浏览(30)
  • Opencv4基于C++基础入门笔记:图像 颜色 事件响应 图形 视频 直方图 Opencv4基于C++的 实时人脸检测

      效果图 ◕‿◕:opencv人脸识别效果图(请叫我真爱粉)✌✌✌先看一下效果图勾起你的兴趣!  文章目录: 一:环境配置搭建 二:图像 1.图像读取与显示 main.cpp  运行结果 2.图像色彩空间转换 2.1 换色彩  test.h  test.cpp main.cpp    运行结果 2.2 照片换背景 test.h        test.

    2024年02月13日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包