使用OpenCV实现Harris角点检测时遇NumPy赋值错误求助
问题解决:Harris角点检测的ValueError及代码修正
错误原因分析
报错的核心是维度不匹配:
- 你传入函数的是单通道灰度图(shape=(244,244)),但赋值语句
image[dst > 0.01 * dst.max()]=[0, 0, 255]试图给每个符合条件的像素分配3个通道的RGB值,NumPy无法将3个值分配给单通道的像素位置,因此触发ValueError。
另外代码还存在三个额外问题:
- 变量
dst_norm_scaled未定义,直接调用会引发NameError; - 未调用
plt.show(),最终无法显示绘图结果; - 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)
关键修正点说明
- 维度匹配:确保赋值的通道数与图像通道数一致——单通道灰度图赋单通道值,三通道RGB图赋三通道值;
- 颜色空间修正:用
COLOR_BGR2GRAY替代COLOR_RGB2GRAY,匹配OpenCV的BGR读取格式; - 定义缺失变量:通过
cv.normalize生成dst_norm_scaled,用于可视化角点响应图; - 显示绘图:添加
plt.show()确保图像窗口弹出。
内容的提问来源于stack exchange,提问作者Adj_G
相关产品推荐
相关产品推荐

