我们上一篇文章写了如何搭建配置虚拟环境,我们用这一篇来校验一下 看看 环境都对不对。因为一个好的项目,想要后面错误少一点,前面就一定要校验没有问题再往下进行下去。
写了这样的一个脚本,当我们校验失败的时候,会这样自动显示出来,显示出来检测的版本和对应要求的版本。这样我们的需求就一目了然。
"""
TCM环境验证脚本 v1.5
修复:补全缺失方法并优化摄像头测试
"""
import sys
import traceback
import numpy as np
import cv2
from pathlib import Path
from time import perf_counter
from importlib.metadata import version, PackageNotFoundError
class TCMEnvValidator:
CORE_DEPENDENCIES = {
'opencv-python-headless': '4.5.5',
'numpy': '1.25.2',
'scipy': '1.9.3',
'matplotlib': '3.6.2'
}
def __init__(self):
self.test_dir = Path("TCM_Env_Test")
self.test_dir.mkdir(exist_ok=True)
self.accel_flags = {
'OPENCV_OPENCL': cv2.ocl.haveOpenCL(),
'NUM_THREADS': cv2.getNumThreads()
}
def _get_package_version(self, pkg_name):
"""安全获取包版本信息"""
try:
return version(pkg_name)
except PackageNotFoundError:
return '未安装'
except Exception as e:
return f'获取失败: {str(e)}'
def check_core_modules(self):
"""核心模块版本验证"""
print("="*40)
print(">>> 依赖版本检测报告 <<<")
py_version = sys.version.split()[0]
print(f"Python 版本: {py_version} ({sys.platform})")
print("\n{:<25} {:<15} {:<15}".format("依赖库", "检测版本", "要求版本"))
print("-"*55)
all_valid = True
for dep, req_ver in self.CORE_DEPENDENCIES.items():
current_ver = self._get_package_version(dep)
status = "✅" if str(current_ver).startswith(req_ver) else "❌"
if "未安装" in current_ver:
status = "⚠️"
all_valid = False
print("{:<25} {:<15} {:<15} {}".format(
dep, current_ver, req_ver, status))
if status == "❌":
all_valid = False
return all_valid
def _generate_gradient(self):
"""生成测试渐变图像"""
x = np.linspace(0, 255, 640, dtype=np.uint8)
return np.tile(x, (480, 1))
def test_image_ops(self):
"""图像处理基础能力测试"""
print("\n" + "="*40)
print(">>> 图像处理能力验证 <<<")
test_results = {}
gradient = self._generate_gradient()
tests = {
'图像写入': lambda: cv2.imwrite(str(self.test_dir/"gradient.jpg"), gradient),
'颜色空间转换': lambda: cv2.cvtColor(gradient, cv2.COLOR_GRAY2BGR),
'边缘检测': lambda: cv2.Canny(gradient, 100, 200),
'形态学操作': lambda: cv2.morphologyEx(gradient, cv2.MORPH_OPEN, np.ones((3,3)))
}
for name, test_func in tests.items():
try:
timer = perf_counter()
result = test_func()
elapsed = (perf_counter() - timer) * 1000
if name == '图像写入':
assert Path(self.test_dir/"gradient.jpg").exists()
elif not isinstance(result, np.ndarray):
result = "N/A"
print(f"✅ {name}: {elapsed:.2f}ms")
test_results[name] = True
except Exception:
print(f"❌ {name} 失败")
test_results[name] = False
traceback.print_exc()
return all(test_results.values())
def test_camera_capture(self):
"""摄像头捕获测试"""
print("\n" + "="*40)
print(">>> 摄像头测试 <<<")
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("⚠️ 未检测到可用摄像头")
return False
try:
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
ret, frame = cap.read()
if not ret:
raise RuntimeError("无法读取摄像头画面")
cv2.imwrite(str(self.test_dir/"camera_test.jpg"), frame)
print("✅ 摄像头测试通过")
return True
except Exception as e:
print(f"❌ 摄像头测试失败: {str(e)}")
return False
finally:
cap.release()
def check_hardware_accel(self):
"""硬件加速检测"""
print("\n" + "="*40)
print(">>> 硬件加速状态 <<<")
print(f"OpenCL 支持: {'✅' if self.accel_flags['OPENCV_OPENCL'] else '❌'}")
print(f"CPU线程数: {self.accel_flags['NUM_THREADS']}")
def run_full_test(self):
"""执行完整测试"""
print("\n" + "="*40)
print(">>> 开始环境诊断 <<<")
deps_valid = self.check_core_modules()
img_ops_ok = camera_ok = False
if deps_valid:
try:
img_ops_ok = self.test_image_ops()
camera_ok = self.test_camera_capture()
self.check_hardware_accel()
except Exception as e:
print(f"\n⚠️ 运行时错误: {str(e)}")
traceback.print_exc()
print("\n" + "="*40)
print(">>> 最终结果 <<<")
print(f"依赖验证: {'✅' if deps_valid else '❌'}")
print(f"图像处理: {'✅' if img_ops_ok else '❌'}")
print(f"摄像头测试: {'✅' if camera_ok else '❌'}")
print(f"硬件加速: {'✅' if self.accel_flags['OPENCV_OPENCL'] else '❌'}")
return deps_valid and img_ops_ok
if __name__ == "__main__":
validator = TCMEnvValidator()
if validator.run_full_test():
print("\n✅ 环境验证通过!")
else:
print("\n❌ 环境验证失败,请检查以下依赖:")
print("pip install opencv-python-headless==4.5.5 numpy==1.25.2")
>>> 图像处理能力验证 <<<
✅ 图像写入: 1.18ms
✅ 颜色空间转换: 56.08ms
✅ 边缘检测: 0.43ms
✅ 形态学操作: 0.10ms
>>> 摄像头测试 <<<
2025-03-08 15:50:37.478 Python[97031:5927042] WARNING: AVCaptureDeviceTypeExternal is deprecated for Continuity Cameras. Please use AVCaptureDeviceTypeContinuityCamera and add NSCameraUseContinuityCameraDeviceType to your Info.plist.
✅ 摄像头测试通过
>>> 硬件加速状态 <<<
OpenCL 支持: ✅
CPU线程数: 12
>>> 最终结果 <<<
依赖验证: ✅
图像处理: ✅
摄像头测试: ✅
硬件加速: ✅
好的,希望你们现在也能跟上我的脚步!!!我们准备开始进行 实际的项目开发吧!!!
(原谅我,用的是Mac电脑,不是特别会windows的操作,有需要的可以私聊我)