Python+OpenCV实现单个圆形孔和针检测

作者:天人合一peng 时间:2023-05-04 10:38:11 

如果中间红色区域是针则可以用下面的代码检测,其阈值和斑点检测的参数根据图像像素值做相应修改

检测的主要思路是先通过找到外面的大圆,再通过圆心定位出一个ROI区域,在ROI区域中检测中心的检测对象

Python+OpenCV实现单个圆形孔和针检测

import os
import cv2
import numpy as np
import math

# 检测针脚位置
def needelCenter_detect(img):
   params = cv2.SimpleBlobDetector_Params()
   # Setup SimpleBlobDetector parameters.
   # print('params')
   # print(params)
   # print(type(params))

# Filter by Area.
   params.filterByArea = True
   params.minArea = 100
   params.maxArea = 10e3
   params.minDistBetweenBlobs = 50
   # params.filterByColor = True
   params.filterByConvexity = False
   # tweak these as you see fit
   # Filter by Circularity
   params.filterByCircularity = False
   params.minCircularity = 0.2
   # params.blobColor = 0
   # # # Filter by Convexity
   # params.filterByConvexity = True
   # params.minConvexity = 0.87
   # Filter by Inertia
   # params.filterByInertia = True
   # params.filterByInertia = False
   # params.minInertiaRatio = 0.01

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Detect blobs.
   minThreshValue = 110
   _, gray = cv2.threshold(gray, minThreshValue, 255, cv2.THRESH_BINARY)
   # gray = cv2.resize(gray, dsize=None, fx=2, fy=2, interpolation=cv2.INTER_LINEAR)
   # plt.imshow(gray)
   # cv2.imshow("gray",gray)

# 找到距离原点(0,0)最近和最远的点

detector = cv2.SimpleBlobDetector_create(params)
   keypoints = detector.detect(gray)
   # print(len(keypoints))
   # print(keypoints[0].pt[0])
   # 如果这儿没检测到可能会出错
   if len(keypoints) == 0:
       print("没有检测到针角坐标,可能需要调整针角斑点检测参数")
       return keypoints

else:
       print(len(keypoints))
       im_with_keypoints = cv2.drawKeypoints(gray, keypoints, np.array([]), (255, 0, 0),
                                             cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

# if keypoints is not None:

color_img = cv2.cvtColor(im_with_keypoints, cv2.COLOR_BGR2RGB)
       # 画出圆的圆心
       cv2.circle(color_img, (int(keypoints[0].pt[0]), int(keypoints[0].pt[1])), 5, (0, 255, 0), -1)
       cv2.imshow("color_img",color_img)
       # cv2.waitKey()

return keypoints

# 检测连接器圆形位置
def circle_detect(image):
   # 灰度化
   circle_img = image.copy()
   gray = cv2.cvtColor(circle_img, cv2.COLOR_BGR2GRAY)
   # 输出图像大小,方便根据图像大小调节minRadius和maxRadius
   # print(image.shape)
   # 进行中值滤波
   img = cv2.medianBlur(gray, 3)

# 针角圆心坐标
   out_x = 0
   out_y = 0

# 霍夫变换圆检测
   circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 10e10, param1=100, param2=30, minRadius=10, maxRadius=100)
   # 如果没检测到会报错
   # 这种判断方式过于简单
   if circles is None:
       print("没有检测到连接器外圆")

else:
       for circle in circles[0]:
           # 圆的基本信息
           # print(circle[2])
           # 坐标行列-圆心坐标
           out_x = int(circle[0])
           out_y = int(circle[1])
           # 半径
           r = int(circle[2])
           # 在原图用指定颜色标记出圆的边界
           cv2.circle(circle_img, (out_x, out_y), r, (0, 0, 255), 2)
           # # 画出圆的圆心
           cv2.circle(circle_img, (out_x, out_y), 3, (0, 255, 255), -1)

# 记录外圆坐标
       out_xpoint = out_x
       out_ypoint = out_y

# 只框出单个针角的位置区域
       step_center = 30
       step_rect = 60
       out_x -= step_center
       out_y -= step_center

needleRect = image[out_y: out_y + step_rect, out_x: out_x + step_rect]
       # cv2.imshow("needleRect", needleRect)

# 根据检测到的圆形连接器中心找针角位置
       centerPoint = needelCenter_detect(needleRect)

if len(centerPoint) == 0:
           print("调整位置")
       else:
               # 将针角的坐标原还至原图
           in_x = int(centerPoint[0].pt[0])
           in_y = int(centerPoint[0].pt[1])
           in_x +=   out_x
           in_y +=   out_y

# 画出针角的圆心
           cv2.circle(circle_img, (in_x, in_y), 3, (0, 255, 0), -1)

# 计算两者的距离
           # 假设通过标定其一个像素代表0.0056mm
           DPI = 0.00568
           dis = math.sqrt(math.pow(out_xpoint - in_x,2) + math.pow(out_ypoint - in_y,2))
           print("两者相互之间的距离为(mm):", dis*DPI)

cv2.imshow("image",circle_img)
           cv2.waitKey(1)

if __name__ == "__main__":

# # 测试0 如果是小图  需要将检测程序中的cv2.waitKey(1)修改为cv2.waitKey()不然看到图片
   # image = cv2.imread("images/CircleLinker/CLinker01.jpg")
   # # cv2.imshow("show",image)
   # # cv2.waitKey()
   # roi = image
   # circle_detect(roi)

# 测试1 从原图中换到连接器位置
   image = cv2.imread("SingleImages/src/single.jpg")
   # cv2.imshow("show",image)
   # cv2.waitKey()
   # 如何准确找到圆形连接器 ---》用yolo训练后能准备找到
   roi = image[1800:2300, 1800:2300 ]
   # cv2.imshow("show",roi)
   # cv2.waitKey()
   circle_detect(roi)

# # 测试2 如果是小图  需要将检测程序中的cv2.waitKey(1)修改为cv2.waitKey()不然看到图片
   # image = cv2.imread("SingleImages/single04.jpg")
   # # cv2.imshow("show",image)
   # # cv2.waitKey()
   # roi = image
   # circle_detect(roi)

# # 测试3 检测文件夹下所有图片
   # path = r"D:\BUFFER\Pycharm\ZhenJiaoDect\SingleImages"
   # for filename in os.listdir(path):  # listdir的参数是文件夹的路径
   #     filenames = path + '\\' + filename
   #     # print(filenames)
   #     img_orig = cv2.imread(filenames, 1)
   #     print(filenames)
   #
   #     if img_orig is None:
   #         print("Warning: No Pictures")
   #     else:
   #         circle_detect(img_orig)

# # # 测试4 打开相机测试
   # # 需要将检测程序中的cv2.waitKey()修改为cv2.waitKey(1)
   # # 否则看到不视频实时检测结果
   # capture = cv2.VideoCapture(0)
   #
   # while (True):
   #     # 获取一帧
   #     ret, frame = capture.read()
   #     circle_detect(frame)
   #
   #     # cv2.imshow('frame', frame)
   #
   #     if cv2.waitKey(1) == ord('q'):
   #         break

来源:https://blog.csdn.net/moonlightpeng/article/details/127569671

标签:Python,OpenCV,圆形,检测
0
投稿

猜你喜欢

  • Pycharm-community-2020.2.3 社区版安装教程图文详解

    2022-07-02 06:30:00
  • numpy中实现ndarray数组返回符合特定条件的索引方法

    2023-04-21 06:21:53
  • Python画图工具Matplotlib库常用命令简述

    2021-10-11 07:28:07
  • python opencv3实现人脸识别(windows)

    2023-11-09 11:21:17
  • Pycharm挂代理后依旧插件下载慢的完美解决方法

    2023-06-17 23:07:31
  • MySQL数据库只监听某个特定地址的方法

    2008-12-05 16:11:00
  • python实现的读取网页并分词功能示例

    2022-05-08 07:06:38
  • MySQL图形化管理工具Navicat安装步骤

    2024-01-29 05:00:45
  • Python提取PDF内容的方法(文本、图像、线条等)

    2023-07-03 13:16:59
  • python实现TF-IDF算法解析

    2021-06-02 03:27:51
  • Python中的XML库4Suite Server的介绍

    2023-08-12 01:26:41
  • Python字典底层实现原理详解

    2021-04-09 12:58:28
  • windows下安装python paramiko模块的代码

    2021-05-11 03:11:23
  • js用星投票的示例代码

    2007-12-29 13:11:00
  • MySQL数据库实验实现简单数据库应用系统设计

    2024-01-27 04:49:34
  • CentOS7使用yum安装Golang的超详细步骤

    2024-04-30 10:08:01
  • SQLServe 重复行删除方法

    2024-01-26 18:39:24
  • Python实现查看系统启动项功能示例

    2022-12-27 17:03:14
  • 不用script仅用css编写无限级弹出菜单

    2008-04-24 14:03:00
  • python实现126邮箱发送邮件

    2022-07-29 23:37:56
  • asp之家 网络编程 m.aspxhome.com