S02|AI中医小助手 - 舌象诊断 OpenCV 「环境配置的校验」

我们上一篇文章写了如何搭建配置虚拟环境,我们用这一篇来校验一下 看看 环境都对不对。因为一个好的项目,想要后面错误少一点,前面就一定要校验没有问题再往下进行下去。

 写了这样的一个脚本,当我们校验失败的时候,会这样自动显示出来,显示出来检测的版本和对应要求的版本。这样我们的需求就一目了然。

"""
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的操作,有需要的可以私聊我)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值