【项目实训】项目工作日志(八)

项目工作日志(八):智能车下位机摄像头检测

引言

在前面的工作中,我们完成了巡航系统的模型部署与预测。接下来,我们将集中在智能车下位机的摄像头检测上,确保摄像头能够实时捕捉并处理视频流,以便进行下一步的图像处理与决策。本部分记录了摄像头检测的详细步骤和代码示例。

摄像头检测

摄像头检测是智能车下位机的重要组成部分,通过实时获取视频流,能够实现对道路、障碍物等的检测与识别。以下是摄像头检测的代码实现。

  1. 导入必要的库
    首先,我们需要导入相关库:
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()

总结
通过以上步骤,我们完成了摄像头检测的实现。通过实时捕捉视频流,智能车能够获取道路和障碍物信息,为图像处理与决策提供基础。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

弈yi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值