MacOS下导入mediapipe遇类重复实现错误求助
MacOS下MediaPipe与OpenCV冲突的重复类警告解决办法
这些警告是因为MediaPipe自带了一套OpenCV动态库,同时你安装的opencv-python也提供了同名的Objective-C类,导致程序加载时出现冲突。虽然这是警告而非直接报错,但可能引发不可预期的行为,以下是几种解决思路:
解决方法1:卸载独立的OpenCV,使用MediaPipe内置版本
MediaPipe安装包已经包含了运行所需的OpenCV组件,不需要额外安装opencv-python。执行以下命令卸载当前的OpenCV:
pip uninstall opencv-python -y
之后直接运行你的手指计数器代码即可,此时import cv2会自动调用MediaPipe自带的OpenCV版本,不会再出现冲突警告。
解决方法2:强制优先加载系统安装的OpenCV
如果需要保留自己安装的opencv-python版本,可以通过设置环境变量让Python优先加载系统的OpenCV库:
在运行脚本前执行:
export DYLD_LIBRARY_PATH=/Users/aliyazici/Library/Python/3.8/lib/python/site-packages/cv2/:$DYLD_LIBRARY_PATH
或者在Python脚本的最开头添加以下代码:
import os os.environ['DYLD_LIBRARY_PATH'] = '/Users/aliyazici/Library/Python/3.8/lib/python/site-packages/cv2/:' + os.environ.get('DYLD_LIBRARY_PATH', '')
注意:MacOS的系统完整性保护(SIP)可能会限制DYLD_LIBRARY_PATH的生效,若此方法无效,建议使用虚拟环境方案。
解决方法3:用虚拟环境隔离依赖
创建独立的虚拟环境,避免全局依赖冲突:
# 创建虚拟环境 python3 -m venv hand-counter-env # 激活虚拟环境 source hand-counter-env/bin/activate # 安装所需依赖 pip install mediapipe opencv-python
在虚拟环境中运行代码,依赖是完全独立的,不会出现库冲突问题。
附用户原始代码
import mediapipe as mp import time import cv2 class handDetector(): def __init__(self, mode=False, maxHands=2, detectionCon=0.5, trackCon=0.5): self.mode = mode self.maxHands = maxHands self.detectionCon = detectionCon self.trackCon = trackCon self.mpHands = mp.solutions.hands self.hands = self.mpHands.Hands(self.mode, self.maxHands, self.detectionCon, self.trackCon) self.mpDraw = mp.solutions.drawing_utils def findHands(self, img, draw=True): imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) self.results = self.hands.process(imgRGB) # print(results.multi_hand_landmarks) if self.results.multi_hand_landmarks: for handLms in self.results.multi_hand_landmarks: if draw: self.mpDraw.draw_landmarks(img, handLms, self.mpHands.HAND_CONNECTIONS) return img def findPosition(self, img, handNo=0, draw=True): lmList = [] if self.results.multi_hand_landmarks: myHand = self.results.multi_hand_landmarks[handNo] for id, lm in enumerate(myHand.landmark): # print(id, lm) h, w, c = img.shape cx, cy = int(lm.x * w), int(lm.y * h) # print(id, cx, cy) lmList.append([id, cx, cy]) if draw: cv2.circle(img, (cx, cy), 15, (255, 0, 255), cv2.FILLED) return lmList
原始错误信息
Class CaptureDelegate is implemented in both /Users/aliyazici/Library/Python/3.8/lib/python/site-packages/cv2/cv2.abi3.so (0x11ae2e538) and /Users/aliyazici/Library/Python/3.8/lib/python/site-packages/mediapipe/.dylibs/libopencv_videoio.3.4.16.dylib (0x11c630860). One of the two will be used. Which one is undefined. objc[38374]: Class CVWindow is implemented in both /Users/aliyazici/Library/Python/3.8/lib/python/site-packages/cv2/cv2.abi3.so (0x11ae2e588) and /Users/aliyazici/Library/Python/3.8/lib/python/site-packages/mediapipe/.dylibs/libopencv_highgui.3.4.16.dylib (0x118ea8a68). One of the two will be used. Which one is undefined. objc[38374]: Class CVView is implemented in both /Users/aliyazici/Library/Python/3.8/lib/python/site-packages/cv2/cv2.abi3.so (0x11ae2e5b0) and /Users/aliyazici/Library/Python/3.8/lib/python/site-packages/mediapipe/.dylibs/libopencv_highgui.3.4.16.dylib (0x118ea8a90). One of the two will be used. Which one is undefined. objc[38374]: Class CVSlider is implemented in both /Users/aliyazici/Library/Python/3.8/lib/python/site-packages/cv2/cv2.abi3.so (0x11ae2e5d8) and /Users/aliyazici/Library/Python/3.8/lib/python/site-packages/mediapipe/.dylibs/libopencv_highgui.3.4.16.dylib (0x118ea8ab8). One of the two will be used. Which one is undefined.
内容的提问来源于stack exchange,提问作者Ali Yazici
相关产品推荐
相关产品推荐

