pythonimport cv2import numpy as npimport matplotlib.pyplot as plt# 1. 环境验证(可选)print("OpenCV版本:", cv2.__version__)# 2. 读取图像(替换为自己的图像路径)img_basic = cv2.imread("chessboard.jpg") # 基础实操图像img_scene1 = cv2.imread("chessboard.jpg") # 场景1:棋盘img_scene2 = cv2.imread("building.jpg") # 场景2:建筑img_scene3 = cv2.imread("natural.jpg") # 场景3:自然img_compare1 = cv2.imread("chessboard.jpg")# 对比图:Shi-Tomasiimg_compare2 = cv2.imread("chessboard.jpg")# 对比图:哈里斯if None in [img_basic, img_scene1, img_scene2, img_scene3, img_compare1, img_compare2]:print("错误:未找到图像,请检查图像路径!")else:# 3. 基础Shi-Tomasi检测gray_basic = cv2.cvtColor(img_basic, cv2.COLOR_BGR2GRAY)gray_basic_blur = cv2.GaussianBlur(gray_basic, (3, 3), sigmaX=1)corners_basic = cv2.goodFeaturesToTrack(gray_basic_blur, maxCorners=50, qualityLevel=0.01, minDistance=10)corners_basic = np.int0(corners_basic)for corner in corners_basic:x, y = corner.ravel()cv2.circle(img_basic, (x, y), 3, (255, 0, 0), -1)# 4. 分场景调优检测scenes = [(img_scene1, 80, 0.01, 8),(img_scene2, 30, 0.02, 15),(img_scene3, 20, 0.03, 20)]scene_results = []for img, maxCorners, qualityLevel, minDistance in scenes:gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)gray_blur = cv2.GaussianBlur(gray, (3, 3), sigmaX=1)corners = cv2.goodFeaturesToTrack(gray_blur, maxCorners=maxCorners, qualityLevel=qualityLevel,minDistance=minDistance, blockSize=3)corners = np.int0(corners)for corner in corners:x, y = corner.ravel()cv2.circle(img, (x, y), 3, (255, 0, 0), -1)scene_results.append(img)# 5. Shi-Tomasi与哈里斯对比gray_compare = cv2.cvtColor(img_compare1, cv2.COLOR_BGR2GRAY)gray_compare_blur = cv2.GaussianBlur(gray_compare, (3, 3), sigmaX=1)# Shi-Tomasicorners_shi = cv2.goodFeaturesToTrack(gray_compare_blur, maxCorners=50, qualityLevel=0.01, minDistance=10)corners_shi = np.int0(corners_shi)for corner in corners_shi:x, y = corner.ravel()cv2.circle(img_compare1, (x, y), 3, (255, 0, 0), -1)# 哈里斯corners_harris = cv2.goodFeaturesToTrack(gray_compare_blur, maxCorners=50, qualityLevel=0.01, minDistance=10,useHarrisDetector=True, k=0.04)corners_harris = np.int0(corners_harris)for corner in corners_harris:x, y = corner.ravel()cv2.circle(img_compare2, (x, y), 3, (0, 0, 255), -1)# 6. 统一显示所有效果plt.figure(figsize=(18, 12))# 第一行:基础检测+对比plt.subplot(3, 4, 1)plt.imshow(cv2.cvtColor(img_basic, cv2.COLOR_BGR2RGB))plt.title("基础Shi-Tomasi检测")plt.axis("off")plt.subplot(3, 4, 2)plt.imshow(cv2.cvtColor(img_compare1, cv2.COLOR_BGR2RGB))plt.title("Shi-Tomasi(蓝色)")plt.axis("off")plt.subplot(3, 4, 3)plt.imshow(cv2.cvtColor(img_compare2, cv2.COLOR_BGR2RGB))plt.title("哈里斯(红色)")plt.axis("off")# 第二行:分场景调优plt.subplot(3, 4, 5)plt.imshow(cv2.cvtColor(scene_results[0], cv2.COLOR_BGR2RGB))plt.title("棋盘场景(maxCorners=80)")plt.axis("off")plt.subplot(3, 4, 6)plt.imshow(cv2.cvtColor(scene_results[1], cv2.COLOR_BGR2RGB))plt.title("建筑场景(maxCorners=30)")plt.axis("off")plt.subplot(3, 4, 7)plt.imshow(cv2.cvtColor(scene_results[2], cv2.COLOR_BGR2RGB))plt.title("自然场景(maxCorners=20)")plt.axis("off")plt.tight_layout()plt.show()# 7. 保存结果(可选)cv2.imwrite("shi_tomasi_basic.jpg", img_basic)cv2.imwrite("shi_tomasi_vs_harris.jpg", np.hstack((img_compare1, img_compare2)))cv2.imwrite("shi_tomasi_scene1.jpg", scene_results[0])cv2.imwrite("shi_tomasi_scene2.jpg", scene_results[1])cv2.imwrite("shi_tomasi_scene3.jpg", scene_results[2]) |