项目工作日志(八):智能车下位机摄像头检测
引言
在前面的工作中,我们完成了巡航系统的模型部署与预测。接下来,我们将集中在智能车下位机的摄像头检测上,确保摄像头能够实时捕捉并处理视频流,以便进行下一步的图像处理与决策。本部分记录了摄像头检测的详细步骤和代码示例。
摄像头检测
摄像头检测是智能车下位机的重要组成部分,通过实时获取视频流,能够实现对道路、障碍物等的检测与识别。以下是摄像头检测的代码实现。
- 导入必要的库
首先,我们需要导入相关库:
import threading
from multiprocessing import Process
import time
import cv2
import platform
import os, sys
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")))
from log_info import logger
2.定义摄像头类
编写 Camera 类,初始化摄像头并启动后台线程读取视频流:
class Camera:
def __init__(self, index=1, width=640, height=320):
self.width = width
self.height = height
self.index = index
self.cap = None
self.frame = None
self.pause_flag = False
self.stop_flag = False
self.init()
self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, self.width)
self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, self.height)
self.flag_thread = False
self.start_back_thread()
def init(self):
while True:
try:
if 'Windows' in platform.platform():
self.src = self.index
self.cap = cv2.VideoCapture(self.src, cv2.CAP_DSHOW)
else:
self.src = "/dev/cam" + str(self.index)
if not os.path.exists(self.src):
logger.error("摄像头{}不存在".format(self.src))
time.sleep(1)
continue
self.cap = cv2.VideoCapture(self.src)
break
except Exception as e:
logger.error("init:摄像头打开错误!")
self.cap.release()
def start_back_thread(self):
if not self.flag_thread:
self.cap_thread = threading.Thread(target=self.update, args=())
self.cap_thread.daemon = True
self.cap_thread.start()
self.flag_thread = True
time.sleep(0.5)
def update(self):
while True:
if self.stop_flag:
break
if self.pause_flag:
continue
try:
ret, frame = self.cap.read()
if ret:
self.frame = frame
else:
logger.error("read:读取图像错误!!!!")
self.cap.release()
self.init()
self.set_size(self.width, self.height)
except Exception as e:
logger.error("exception:摄像头错误!!")
self.cap.release()
self.init()
self.set_size(self.width, self.height)
def set_size(self, width, height):
self.width = width
self.height = height
self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, self.width)
self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, self.height)
def read(self):
while self.frame is None:
time.sleep(0.1)
return self.frame
def close(self):
self.stop_flag = True
self.cap_thread.join()
logger.info("{} close".format(self.src))
self.cap.release()
3.主函数
编写主函数,测试摄像头读取功能并显示视频流:
def main():
camera = Camera(2, 640, 480)
while True:
try:
img = camera.read()
cv2.imshow("img", img)
key = cv2.waitKey(1)
if key == ord('q'):
time.sleep(0.1)
break
except Exception as e:
logger.error(e)
camera.close()
logger.info("over")
cv2.destroyAllWindows()
if __name__ == "__main__":
main()
总结
通过以上步骤,我们完成了摄像头检测的实现。通过实时捕捉视频流,智能车能够获取道路和障碍物信息,为图像处理与决策提供基础。