You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用OpenCV实现Harris角点检测时遇NumPy赋值错误求助

问题解决:Harris角点检测的ValueError及代码修正

错误原因分析

报错的核心是维度不匹配:

  • 你传入函数的是单通道灰度图(shape=(244,244)),但赋值语句image[dst > 0.01 * dst.max()]=[0, 0, 255]试图给每个符合条件的像素分配3个通道的RGB值,NumPy无法将3个值分配给单通道的像素位置,因此触发ValueError。

另外代码还存在三个额外问题:

  1. 变量dst_norm_scaled未定义,直接调用会引发NameError;
  2. 未调用plt.show(),最终无法显示绘图结果;
  3. OpenCV默认以BGR格式读取图像,用COLOR_RGB2GRAY转灰度会导致颜色空间错误,应改为COLOR_BGR2GRAY。

修正后的完整代码

方案一:转三通道RGB图标记红色角点

将灰度图转为三通道后再标记角点,符合你预期的彩色标记效果:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

def HarrisCornerDetection(image):
    # 保存原始灰度图用于显示,同时转为三通道图用于标记角点
    gray_image = image.copy()
    rgb_image = cv.cvtColor(gray_image, cv.COLOR_GRAY2RGB)
    
    # Harris角点检测流程
    gray_float = np.float32(gray_image)
    dst = cv.cornerHarris(gray_float, 2, 3, 0.04) 
    dst = cv.dilate(dst, None)
    
    # 归一化dst用于可视化角点响应图
    dst_norm_scaled = cv.normalize(dst, None, 0, 255, cv.NORM_MINMAX, dtype=cv.CV_8U)

    plt.figure(figsize=(10, 10))
    # 显示原始灰度图
    plt.subplot(1,2,1), plt.imshow(gray_image, cmap='gray')
    plt.title('Original Image')
    
    # 在三通道图上标记红色角点(matplotlib显示RGB格式,红色为(255,0,0))
    rgb_image[dst > 0.01 * dst.max()] = [255, 0, 0]
    plt.subplot(1,2,2), plt.imshow(rgb_image)
    plt.title('Harris Corners')
    
    plt.show()

# 读取并预处理图像
image = cv.imread('image.jpeg')
image = cv.resize(image, (244, 244))
image = cv.cvtColor(image, cv.COLOR_BGR2GRAY)  # 修正颜色转换逻辑
HarrisCornerDetection(image)

方案二:保留灰度图标记白色角点

如果不需要彩色标记,直接在灰度图上用白色(255)标记角点:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

def HarrisCornerDetection(image):
    image_float = np.float32(image)
    
    dst = cv.cornerHarris(image_float, 2, 3, 0.04) 
    dst = cv.dilate(dst, None)
    dst_norm_scaled = cv.normalize(dst, None, 0, 255, cv.NORM_MINMAX, dtype=cv.CV_8U)

    plt.figure(figsize=(10, 10))
    plt.subplot(1,2,1), plt.imshow(image, cmap='gray')
    plt.title('Original Image')
    
    # 灰度图赋值单通道值(白色)
    image[dst > 0.01 * dst.max()] = 255
    plt.subplot(1,2,2), plt.imshow(image, cmap='gray')
    plt.title('Harris Corners')
    
    plt.show()

image = cv.imread('image.jpeg')
image = cv.resize(image, (244, 244))
image = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
HarrisCornerDetection(image)

关键修正点说明

  1. 维度匹配:确保赋值的通道数与图像通道数一致——单通道灰度图赋单通道值,三通道RGB图赋三通道值;
  2. 颜色空间修正:用COLOR_BGR2GRAY替代COLOR_RGB2GRAY,匹配OpenCV的BGR读取格式;
  3. 定义缺失变量:通过cv.normalize生成dst_norm_scaled,用于可视化角点响应图;
  4. 显示绘图:添加plt.show()确保图像窗口弹出。

内容的提问来源于stack exchange,提问作者Adj_G

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 03:42:42