|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2023-2-28 09:45:54
|
显示全部楼层
你实测过对比过吗?
我用pygame测试,用同样的测试方法,用pygame的get_image()方法,帧率上不去,只能到40多帧,但是用opencv的VideoCapture.read(),帧率能到80多,摄像头本身是能到120帧的
还有个奇怪的问题,即使在单独的线程里,用pygame读摄像头,也会严重挤占cpu资源,导致图像检测线程帧率严重下降,整个程序占用的cpu资源始终在10%以下
但是用opencv读摄像头,图像检测线程的帧率会快很多,整个程序占用的cpu资源能到18%
用pygame,测试帧率在40多,延迟时间在120ms左右
用opencv,测试帧率能到80多,延迟时间在80ms左右
如何改进呢,帮忙分析一下吧
下面是分别使用opencv和pygame读摄像头的代码
#使用opencv
def read_cam():
# 创建相机对象
# 设置相机
cap1 = cv2.VideoCapture(701)
cap1.set(3, 1280)
cap1.set(4, 720)
cap2 = cv2.VideoCapture(700)
cap2.set(3, 1280)
cap2.set(4, 720)
print("曝光:", cap1.get(15), cap2.get(15))
cnt = 0;
time_last = time.time()
while True:
# 读取摄像头图像
ret1, frame1 = cap1.read()
ret2, frame2 = cap2.read()
height, width = frame1.shape[:2]
# 高度裁剪为32的整数倍
cropped_frame1 = frame1[8:height - 8, :]
cropped_frame2 = frame2[8:height - 8, :]
# 垂直拼接和缩放图像
frame_lr = cv2.vconcat([cropped_frame1,cropped_frame2])
frame_lr = cv2.resize(frame_lr,(640,704))
# read_cam.frame = frame_lr
frame_queue.put(frame_lr)
# 统计帧率
cnt = cnt + 1;
if(cnt == 99):
cnt = 0;
time_interval = time.time()-time_last
time_last = time.time()
fps = 100/time_interval
fps = round(fps,1)
print("read_cam帧率:",fps,np.size(frame_lr),np.shape(frame_lr))
#使用pygame
def read_cam():
# 创建相机对象
# 设置相机
pygame.init()
pygame.camera.init()
# 获取摄像头列表
cam_list = pygame.camera.list_cameras()
if not cam_list:
print('没有找到摄像头!')
quit()
# 选择第一个摄像头
cam1 = pygame.camera.Camera(cam_list[0],(1280,720))
cam2 = pygame.camera.Camera(cam_list[1],(1280,720))
cam1.start()
cam2.start()
cnt = 0;
time_last = time.time()
while True:
# 读取摄像头图像
image1 = cam1.get_image() # 阻塞等待摄像头响应
image1 = pygame.transform.rotate(image1, 90)
cv_image1 = cv2.cvtColor(pygame.surfarray.array3d(image1),cv2.COLOR_RGB2BGR)
image2 = cam2.get_image() # 阻塞等待摄像头响应
image2 = pygame.transform.rotate(image2, 90)
cv_image2 = cv2.cvtColor(pygame.surfarray.array3d(image2),cv2.COLOR_RGB2BGR)
height, width = cv_image1.shape[:2]
# 高度裁剪为32的整数倍
cropped_frame1 = cv_image1[8:height - 8, :]
cropped_frame2 = cv_image2[8:height - 8, :]
# 垂直拼接和缩放图像
frame_lr = cv2.vconcat([cropped_frame1,cropped_frame2])
frame_lr = cv2.resize(frame_lr,(640,704))
# read_cam.frame = frame_lr
frame_queue.put(frame_lr)
# 统计帧率
cnt = cnt + 1;
if(cnt == 99):
cnt = 0;
time_interval = time.time()-time_last
time_last = time.time()
fps = 100/time_interval
fps = round(fps,1)
print("read_cam帧率:",fps)
|
|