当前位置: 首页 > news >正文

检测十字标 opencv python

十字标是正的

def detect_cross_by_projection(image_path, k=1.0, sigma=1.0):# 1. 读取图像并转换为灰度图image = cv2.imread(image_path)if image is None:print("无法读取图像,请检查路径!")return Nonegray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 图片旋转5°rows, cols = image.shape[:2]M = cv2.getRotationMatrix2D((cols/2, rows/2), 3, 1)image = cv2.warpAffine(gray, M, (cols, rows))# 2. 边缘检测(Canny)edges = cv2.Canny(image, 100, 200, apertureSize=3)# 3. 统计行和列的边缘像素和(投影)row_projection = np.sum(edges, axis=1)  # 行投影col_projection = np.sum(edges, axis=0)  # 列投影# 4. 高斯平滑投影曲线row_projection_smooth = cv2.GaussianBlur(row_projection.astype(np.float32), (0, 0), sigma)col_projection_smooth = cv2.GaussianBlur(col_projection.astype(np.float32), (0, 0), sigma)# 5. 检测峰(局部极大且大于 mean + k*std)def detect_peaks(projection, k):mean = np.mean(projection)std = np.std(projection)threshold = mean + k * stdpeaks = []for i in range(1, len(projection) - 1):if projection[i] > projection[i-1] and projection[i] > projection[i+1] and projection[i] > threshold:peaks.append(i)return peaksrow_peaks = detect_peaks(row_projection_smooth, k)col_peaks = detect_peaks(col_projection_smooth, k)# 6. 取最显著的行峰和列峰if not row_peaks or not col_peaks:print("未检测到峰!")return None# 选择最显著的峰(投影值最大的峰)row_peak = row_peaks[np.argmax(row_projection_smooth[row_peaks])]col_peak = col_peaks[np.argmax(col_projection_smooth[col_peaks])]# 7. 计算交点并可视化cross_point = (col_peak, row_peak)# 绘制检测结果result_image = image.copy()cv2.circle(result_image, cross_point, 10, (0, 0, 255), -1)  # 绘制交点cv2.line(result_image, (0, row_peak), (result_image.shape[1], row_peak), (0, 0, 255), 2)  # 绘制行线cv2.line(result_image, (col_peak, 0), (col_peak, result_image.shape[0]), (0, 0, 255), 2)  # 绘制列线# 8. 可视化投影曲线和峰plt.figure(figsize=(12, 6))# 行投影plt.subplot(1, 2, 1)plt.plot(row_projection, label="Row Projection")plt.plot(row_projection_smooth, label="Smoothed Row Projection")plt.axhline(y=np.mean(row_projection_smooth) + k * np.std(row_projection_smooth), color='r', linestyle='--', label="Threshold")plt.scatter(row_peaks, row_projection_smooth[row_peaks], color='g', label="Peaks")plt.title("Row Projection")plt.legend()# 列投影plt.subplot(1, 2, 2)plt.plot(col_projection, label="Column Projection")plt.plot(col_projection_smooth, label="Smoothed Column Projection")plt.axhline(y=np.mean(col_projection_smooth) + k * np.std(col_projection_smooth), color='r', linestyle='--', label="Threshold")plt.scatter(col_peaks, col_projection_smooth[col_peaks], color='g', label="Peaks")plt.title("Column Projection")plt.legend()plt.tight_layout()plt.show()# 9. 显示中间图和结果图cv2.imshow("image", image)cv2.imshow("Result", result_image)cv2.waitKey(0)cv2.destroyAllWindows()print("Detected Cross Point:", cross_point)

原图在这里插入图片描述
统计垂直方向和水平方向
在这里插入图片描述
马上就能找到中点了

但是一旦图像旋转了3°,这个算法立马失效,比如下面的

在这里插入图片描述

http://www.dtcms.com/a/506938.html

相关文章:

  • NSSCTF - Web | 【SWPUCTF 2021 新生赛】Do_you_know_http
  • Linux小课堂: 流、重定向与 cut 命令进阶
  • 虚拟内存核心常识
  • ubuntu配置mysql8.0并设置Navicat网络连接
  • 深圳网站维护一般多少钱网址大全黄免费片
  • 从若依框架看权限设计与数据字典:背后的工程化思考
  • 邦策网站建设平台网站建设文化咨询
  • ASTM D7033-2022 定向刨花板检测
  • 使用ThreadLocal的一些注意事项
  • Kotion 常见用法注意事项(持续更新...)
  • 如何使用思维导图提升信息整理效率
  • K-VXE-TABLE二次封装,含table‘自定义列功能
  • 基于 GEE 开发的一种利用 OTSU 算法实现水体提取的便捷工具
  • Linux小课堂: 深入解析 top、htop、glances 及进程终止机制
  • 建设协会网站洛阳伟创科技
  • MongoDB 提供的 `GridFSTemplate` 操作 GridFS 大文件系统的常用查询方式
  • 2025年ASOC SCI2区TOP,基于模糊分组的多仓库多无人机电力杆巡检模因算法,深度解析+性能实测
  • 无人机地面站中不同的飞行模式具体含义释义(开源飞控常用的5种模式)
  • Inventor 转换为 3DXML 全流程技术指南:附迪威模型网在线方案
  • Maven POM 简介
  • pytorch踩坑记录
  • seo每天一贴博客南宁网站排名优化电话
  • 手机端网站开发书籍徐州vi设计公司
  • STM32F1和STM32F4在配置硬件SPI1时有什么不同?
  • 衣柜灯橱柜灯MCU方案开发
  • 数据访问对象模式(Data Access Object Pattern)
  • 滚动显示效果
  • Spring Cloud - Spring Cloud 微服务概述 (微服务的产生与特点、微服务的优缺点、微服务设计原则、微服务架构的核心组件)
  • YOLOv4:目标检测领域的 “速度与精度平衡大师”
  • agent设计模式:第二章节—路由