mi-task/test/test_detect_bar.py

94 lines
3.6 KiB
Python

import cv2
import os
import sys
import time
import argparse
# 添加父目录到系统路径
current_dir = os.path.dirname(os.path.abspath(__file__))
project_root = os.path.dirname(current_dir)
sys.path.append(project_root)
from utils.detect_bar import detect_bar_top_distance
def process_image(image_path, save_dir=None, show_steps=False, observe=False, delay=800):
"""处理单张图像"""
print(f"处理图像: {image_path}")
# 读取图片
image = cv2.imread(image_path)
if image is None:
print(f"错误:无法读取图像 '{image_path}'")
return None
# 检测栏杆到顶部的距离
start_time = time.time()
top_distance = detect_bar_top_distance(image, observe=observe, delay=delay)
processing_time = time.time() - start_time
# 输出结果
if top_distance is not None:
print(f"处理时间: {processing_time:.3f}")
print(f"栏杆顶部到图像顶部的距离: {top_distance}像素")
# 如果要显示结果
if show_steps:
# 在图像上标记栏杆顶部位置
result_image = image.copy()
cv2.line(result_image, (0, top_distance), (result_image.shape[1], top_distance), (0, 255, 0), 2)
cv2.putText(result_image, f"Distance: {top_distance}px", (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
# 显示结果
cv2.imshow("Bar Detection Result", result_image)
cv2.waitKey(delay)
# 如果指定了保存目录,保存结果
if save_dir:
if not os.path.exists(save_dir):
os.makedirs(save_dir)
# 在图像上标记栏杆顶部位置(如果之前没有标记)
if not show_steps:
result_image = image.copy()
cv2.line(result_image, (0, top_distance), (result_image.shape[1], top_distance), (0, 255, 0), 2)
cv2.putText(result_image, f"Distance: {top_distance}px", (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
# 构建保存路径
base_name = os.path.basename(image_path)
save_path = os.path.join(save_dir, f"result_{base_name}")
cv2.imwrite(save_path, result_image)
print(f"结果已保存至: {save_path}")
else:
print("未能检测到栏杆")
# 关闭所有窗口
if show_steps:
cv2.destroyAllWindows()
return top_distance
def main():
parser = argparse.ArgumentParser(description='灰色栏杆检测演示程序')
parser.add_argument('--input', default='./res/bar/image_20250525_085240.png', type=str, help='输入图像的路径')
parser.add_argument('--output', default='./res/bar/result', type=str, help='输出结果的保存目录')
parser.add_argument('--show', default=True, action='store_true', help='显示处理结果')
parser.add_argument('--observe', default=True, action='store_true', help='显示中间处理步骤')
parser.add_argument('--delay', type=int, default=800, help='显示中间结果的延迟时间(ms)')
args = parser.parse_args()
# 检查输入路径
if not os.path.exists(args.input):
print(f"错误:文件 '{args.input}' 不存在")
return
# 获取输出目录
output_dir = args.output if args.output else os.path.dirname(args.input)
# 处理图像
process_image(args.input, output_dir, args.show, args.observe, args.delay)
if __name__ == "__main__":
main()