首页 > 其他分享 >opencv检测黑色轮廓(矩形)

opencv检测黑色轮廓(矩形)

时间:2023-08-08 23:44:24浏览次数:31  
标签:__ approx 矩形 obj img self cv2 opencv 轮廓

opencv检测黑色轮廓:

import cv2
import numpy as np

class ShapeDetector:
    def __init__(self, image_path):
        self.image_path = image_path
        self.img = cv2.imread(self.image_path)  # 读取图像
        self.imgContour = self.img.copy()  # 创建一个用于绘制轮廓的副本

    def detect_shapes(self):
        imgGray = cv2.cvtColor(self.img, cv2.COLOR_BGR2GRAY)  # 转换为灰度图像
        imgBlur = cv2.GaussianBlur(imgGray, (5, 5), 1)  # 高斯模糊
        imgCanny = cv2.Canny(imgBlur, 60, 60)  # Canny边缘检测
        self.shape_detection(imgCanny)  # 进行形状检测

        # 显示图像
        cv2.imshow("原始图像", self.img)
        cv2.imshow("灰度图", imgGray)
        cv2.imshow("模糊图", imgBlur)
        cv2.imshow("边缘检测图", imgCanny)
        cv2.imshow("形状检测", self.imgContour)

        cv2.waitKey(0)
        cv2.destroyAllWindows()

    def shape_detection(self, img):
        contours, hierarchy = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)  # 寻找轮廓
        for obj in contours:
            area = cv2.contourArea(obj)  # 计算轮廓区域面积
            cv2.drawContours(self.imgContour, [obj], -1, (255, 0, 0), 4)  # 绘制轮廓线
            perimeter = cv2.arcLength(obj, True)  # 计算轮廓周长
            approx = cv2.approxPolyDP(obj, 0.02 * perimeter, True)  # 近似多边形
            corner_num = len(approx)  # 角点数量
            x, y, w, h = cv2.boundingRect(approx)  # 获取边界框坐标

            if corner_num == 3:
                obj_type = "三角形"
            elif corner_num == 4:
                for i in range(0, 4):
                    print("矩形角坐标%d:" % (i + 1), approx[i][0][0], approx[i][0][1])
                    cv2.circle(self.imgContour, (approx[i][0][0], approx[i][0][1]), 5, (0, 255, 255), 3)
                if w == h:
                    obj_type = "正方形"
                else:
                    obj_type = "矩形"
            elif corner_num > 4:
                obj_type = "多边形"
            else:
                obj_type = "未知"

            cv2.rectangle(self.imgContour, (x, y), (x + w, y + h), (0, 0, 255), 2)  # 绘制边界框
            cv2.putText(self.imgContour, obj_type, (x + (w // 2), y + (h // 2)), cv2.FONT_HERSHEY_COMPLEX, 0.6, (0, 0, 0), 1)

if __name__ == "__main__":
    image_path = './test.jpg'
    shape_detector = ShapeDetector(image_path)
    shape_detector.detect_shapes()

标签:__,approx,矩形,obj,img,self,cv2,opencv,轮廓
From: https://www.cnblogs.com/hnu-hua/p/17615716.html

相关文章

  • opencv-python特征匹配
    本章节介绍暴力特征匹配,FLANN特征匹配等。根据前面章节获取的图像特征点和描述子之后,可以将两幅图像进行特征匹配。1暴力特征匹配通过枚举的方式进行特征匹配,使用第一幅图像中一个特征的描述子,并使用一些距离计算将其与第二幅图像中的所有其他特征匹配,返回最近的一个。opencv......
  • opencv-python特征检测
    本章节介绍Harris角点检测,SIFT关键点检测,shi-Tomasi角点检测,SURF特征检测,ORB特征检测。特征检测是提取图像信息,决定每个图像的点是否属于一个图像特征。其结果是把图像上的点分为不同的子集,这些子集往往属于孤立的点,连续的曲线或连续的区域。特征检测包括边缘检测,角检测,区域检测......
  • opencv-python 图像分割
    本章节介绍图像分割方面的算法:分水岭算法,grabcut算法,meanshift算法等知识。图像分割:将前景物体从背景中提取出来。图像分割分为传统图像分割和基于深度学习的图像分割。传统图像分割有:分水岭算法,grabcut算法,meanshift算法,背景抠出等。1分水岭算法分水岭算法是基于图像形态学......
  • JavaOpenCV相似度计算基础教程
    JavaOpenCV相似度计算基础教程JavaOpenCV是一个基于开放源代码的计算机视觉库,它可以实现许多计算机视觉任务,如图像处理、物体识别和图像相似度计算等。本教程旨在向您介绍JavaOpenCV中的相似度计算基础,帮助您理解如何使用该库计算图像之间的相似度。JavaOpenCV相似度计算基础教程图......
  • #yyds干货盘点# LeetCode程序员面试金典:矩形区域不超过 K 的最大数值和
    1.简述:给你一个mxn的矩阵matrix和一个整数k,找出并返回矩阵内部矩形区域的不超过k的最大数值和。题目数据保证总会存在一个数值和不超过k的矩形区域。 示例1:输入:matrix=[[1,0,1],[0,-2,3]],k=2输出:2解释:蓝色边框圈出来的矩形区域 [[0,1],[-2,3]] 的数值和是......
  • 快速入门OpenCv(python版)
    OpenCV是一个(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上。它轻量级而且高效——由一系列C函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。在学习过程中遇到问题最好的办法就是......
  • OpenGL之绘制矩形使用索引和glUniform4f
    glUniform更改一个uniform变量或数组的值。要更改的uniform变量的位置由location指定,location的值应该由glGetUniformLocation函数返回。通过调用glUseProgram,glUniform操作的程序对象将成为当前状态的一部分。glUniform{1|2|3|4}{f|i}使用传进来的实参,修改通过location指定的uni......
  • 代码随想录算法训练营第四十六天| 84.柱状图中最大的矩形
     84.柱状图中最大的矩形要求:有多个矩形,要求返回可能勾勒出的最大矩形思路:寻找右边第一个小于当前节点的index寻找左边第一个小于当前节点的index 右边:累加的方式,如果当前节点小于,那么判读后放进去左边,放进去了之后,当前节点后一个,就是左边最小的代码:1//要求:和相......
  • VScode+X11支持连接服务器时支持open3d、openCV、matplotlib等可视化
    背景连接服务器以后,想用open3d可视化点云、matplotlib画点图,但是一直不能用,原因也很简单,就是没有配置GUI传输显示,那肯定是要配置X11相关的东西。过程服务器确保服务器下载了xterm、xorg-x11-xauth两个包,不确定可以用dpkg-l加正则表达式查看,应该基本上都有。之后检查/etc/ssh/......
  • OpenCV图像处理技巧之空间滤波
    1.引言再次问好,图像处理爱好者们!......