!(function () { // 老的浏览器可能根本没有实现 mediaDevices,所以我们可以先设置一个空的对象 if (navigator.mediaDevices === undefined) { navigator.mediaDevices = {}; } if (navigator.mediaDevices.getUserMedia === undefined) { navigator.mediaDevices.getUserMedia = function (constraints) { // 首先,如果有getUserMedia的话,就获得它 var getUserMedia = navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia; // 一些浏览器根本没实现它 - 那么就返回一个error到promise的reject来保持一个统一的接口 if (!getUserMedia) { return Promise.reject(new Error('getUserMedia is not implemented in this browser')); } // 否则,为老的navigator.getUserMedia方法包裹一个Promise return new Promise(function (resolve, reject) { getUserMedia.call(navigator, constraints, resolve, reject); }); } } const constraints = { video: true, audio: false }; let promise = navigator.mediaDevices.getUserMedia(constraints); promise.then(stream => { let v = document.getElementById('v'); // 旧的浏览器可能没有srcObject if ("srcObject" in v) { v.srcObject = stream; } else { // 防止再新的浏览器里使用它,应为它已经不再支持了 v.src = window.URL.createObjectURL(stream); } v.onloadedmetadata = function (e) { v.play(); }; }).catch(err => { console.error(err.name + ": " + err.message); }) })(); face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') # Change cv2.VideoCapture(1) to cv2.VideoCapture(0). It is a MacOS bug for Coaca applications # https://github.com/Classical-machine-learning/invisiblityCloak/issues/3 cap = cv2.VideoCapture(1) # ArduinoSerial = serial.Serial('/dev/cu.usbserial-120', 9600, timeout=0.1) curr_num_faces = 0 while cap.isOpened(): ret, frame = cap.read() frame = cv2.flip(frame, 1) # mirror the image gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, 1.1, 6) # detect the face num_faces = len(faces) string = '{0:d}'.format(num_faces) print(string) if num_faces != curr_num_faces: # ArduinoSerial.write(string.encode('utf-8')) curr_num_faces = num_faces for x, y, w, h in faces: cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 3) cv2.imshow('img', frame) # press q to Quit if cv2.waitKey(10) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()