ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

树莓派基于cv2包驱动KS2A242摄像头拍照过程中遇到的问题以及解决方法

2021-04-26 19:58:22  阅读:248  来源: 互联网

标签:CAPTURE 树莓 self cap cv2 KS2A242 frame FRAME 摄像头


写在前面

之前我已经写过一些树莓派通过python发送命令控制底盘子系统按照预定轨迹行走的博客了,传送门在下面:

完成了底盘子系统的运动控制之后,就需要做图像识别了,那么完成图像识别的前提就是拍照,拍照就需要用到摄像头,我们小组选用的摄像头是KS2A242,那么在我驱动2个KS2A242摄像头过程中,遇到了一些问题,特此写这篇摄像头记录一下。

图片概览

在这里插入图片描述
在这里插入图片描述

遇到的问题

在我刚开始驱动这个摄像头的时候的python程序长这样

   	  self.cap0 = MyThreadCapture(0, CAPTURE_FRAME_WIDTH, CAPTURE_FRAME_HEIGHT)
      self.cap1 = MyThreadCapture(1, CAPTURE_FRAME_WIDTH, CAPTURE_FRAME_HEIGHT)

      if self.cap0.is_opened() is False:
          self.cap0 = MyThreadCapture(0, CAPTURE_FRAME_WIDTH, CAPTURE_FRAME_HEIGHT)
      if self.cap1.is_opened() is False:
          self.cap1 = MyThreadCapture(1, CAPTURE_FRAME_WIDTH, CAPTURE_FRAME_HEIGHT)

       self.cap0.setDaemon(True)
       self.cap0.start()
       self.cap1.setDaemon(True)
       self.cap1.start()

摄像头的驱动类如下

class MyThreadCapture(threading.Thread):
   def __init__(self, capture_source, capture_frame_width, capture_frame_height):
       threading.Thread.__init__(self)
       self.cap = cv2.VideoCapture(capture_source)
       self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, capture_frame_width)
       self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, capture_frame_height)
       self.img = None
       self.lock = threading.Lock()
       self.stop_cap = False
       print('cap ' + str(capture_source) + str(self.cap.isOpened()))

   def is_opened(self):
       return self.cap.isOpened()

   def run(self):
       # ret, frame = self.cap.read()
       while True:
           if self.stop_cap is True:
               print('cap stop !')
               self.cap.release()
               break
           if self.lock.acquire():
               ret, frame = self.cap.read()
               if ret is True:
                   self.img = frame
               self.lock.release()
           time.sleep(0.01)

   def get_img(self):
       frame = None
       while True:
           if self.lock.acquire():
               frame = self.img
               self.lock.release()
               break
       return frame

   def stopp(self):
       self.stop_cap = True

在网上搜索驱动树莓派驱动2个摄像头的结果都是教我们这样写的,于是我也类比着写了一个,稍微特别一点的就是我专门写了一个类来做摄像头的初始化,但是,事情的发展总是不遂人愿的,python解释器报了的错误。

错误截图

这个语句就是告诉我们,需要程序根据index 1去找摄像头1,但是找不到,为什么呢?开始我也是百思不得其解,后来经过仔细分析,终于解决了问题。
在这里插入图片描述

解决方法

首先我们用ls /dev/video*命令去查找接入树莓派的设备,根据插拔摄像头0和摄像头1观察当前接入树莓派的设备

摄像头0,1都插上

在这里插入图片描述

只插了摄像头0

在这里插入图片描述

一个摄像头都没插

在这里插入图片描述
聪明的大家肯定已经发现了其中的规律,摄像头0对应的是/dev/video0/dev/video1这2个设备,摄像头1对应的是/dev/video2/dev/video3这2个设备,

问题解决
在这里插入图片描述

标签:CAPTURE,树莓,self,cap,cv2,KS2A242,frame,FRAME,摄像头
来源: https://blog.csdn.net/weixin_43454320/article/details/116105369

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有