import cv2 import pickle import socket # 创建socket连接 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client_socket.connect(('10.132.11.225', 8080)) # 采集人脸照片 face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, 1.3, 5) for (x, y, w, h) in faces: roi_gray = gray[y:y + h, x:x + w] roi_color = frame[y:y + h, x:x + w] cv2.imwrite('face.jpg', roi_color) break if cv2.waitKey(1) & 0xFF == ord('q'): break # 将人脸照片序列化并发送给接收端 with open('face.jpg', 'rb') as f: data = pickle.dumps(f.read()) client_socket.sendall(data) # 关闭socket连接和摄像头 client_socket.close() cap.release() cv2.destroyAllWindows()优化一下摄像头开启速度
时间: 2024-03-23 16:36:18 浏览: 130
要优化摄像头开启速度,可以将摄像头的启动放在循环外部,避免重复启动摄像头。另外,可以考虑使用多线程或者异步方式采集和发送人脸照片,避免阻塞主线程。下面是一个简单的优化版本的代码:
```python
import cv2
import pickle
import socket
import threading
# 创建socket连接
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('10.132.11.225', 8080))
# 采集人脸照片
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
cap = cv2.VideoCapture(0)
ret, frame = cap.read()
# 创建线程采集和发送人脸照片
def capture_and_send():
while True:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x, y, w, h) in faces:
roi_gray = gray[y:y + h, x:x + w]
roi_color = frame[y:y + h, x:x + w]
with open('face.jpg', 'wb') as f:
pickle.dump(roi_color, f)
with open('face.jpg', 'rb') as f:
data = f.read()
client_socket.sendall(data)
break
# 启动线程
t = threading.Thread(target=capture_and_send)
t.start()
# 等待程序结束
cv2.waitKey(0)
# 关闭socket连接和摄像头
client_socket.close()
cap.release()
cv2.destroyAllWindows()
```
在优化版本的代码中,首先在循环外部采集摄像头的第一帧图像,并创建一个线程来采集和发送人脸照片。线程中使用了 pickle 序列化和反序列化方法来传输人脸照片数据,并使用 sendall 方法来发送数据,避免数据丢失。最后,等待程序结束,关闭连接和摄像头。该程序可以加快摄像头的启动速度,并且能够连续采集和发送人脸照片。
阅读全文