检测十字标 opencv python

十字标是正的

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 None
    gray = 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 * std
        peaks = []
        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 peaks

    row_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°,这个算法立马失效,比如下面的

相关推荐
zbhbbedp282793cl2 分钟前
如何在VSCode中安装Python扩展?
ide·vscode·python
gorgeous(๑>؂<๑)2 小时前
【ICLR26匿名投稿】OneTrackerV2:统一多模态目标跟踪的“通才”模型
人工智能·机器学习·计算机视觉·目标跟踪
Python私教2 小时前
Python 开发环境安装与配置全指南(2025版)
开发语言·python
百锦再2 小时前
第12章 测试编写
android·java·开发语言·python·rust·go·erlang
熠熠仔2 小时前
QGIS 3.34+ 网络分析基础数据自动化生成:从脚本到应用
python·数据分析
王哈哈^_^2 小时前
【完整源码+数据集】课堂行为数据集,yolo课堂行为检测数据集 2090 张,学生课堂行为识别数据集,目标检测课堂行为识别系统实战教程
人工智能·算法·yolo·目标检测·计算机视觉·视觉检测·毕业设计
测试19982 小时前
Appium使用指南与自动化测试案例详解
自动化测试·软件测试·python·测试工具·职场和发展·appium·测试用例
神仙别闹3 小时前
基于 C++和 Python 实现计算机视觉
c++·python·计算机视觉
hongjianMa3 小时前
【论文阅读】Hypercomplex Prompt-aware Multimodal Recommendation
论文阅读·python·深度学习·机器学习·prompt·推荐系统
Shang180989357263 小时前
T41NQ/T41N高性能低功耗SOC芯片 软硬件资料T41NQ适用于各种AIoT应用,适用于智能安防、智能家居,机器视觉等领域方案
驱动开发·嵌入式硬件·计算机视觉·fpga开发·信息与通信·t41nq