当前位置: 代码网 > it编程>编程语言>Asp.net > 树莓派使用opencv

树莓派使用opencv

2024年08月05日 Asp.net 我要评论
注意:将摄像头的USB口连接到树莓派的任意一个USB口后再开机。一定要先接摄像头再开机,不然树莓派无法识别。输入lsusb或者命令查看是否有ID:05a3:9230 ARC International Camera或者/dev/video0 设备有的话说明树莓派已经检测到我们的摄像头设备,可以进行下一步操作要使用摄像头模块,你必须使用一个较新的操作系统,它能识别出摄像头模块已连接上。最简单的方法就是直接从树莓派官网去下载一个Raspbian的系统镜像然后安装到一个全新的SD卡上。

目录

一. 使用摄像头

1. 将摄像头连接到我们树莓派

二.升级系统

三.在raspi-config中使能ssh和摄像头服务

二. 安装opencv

1.查看自己系统的python

2.换源(非常非常重要,成不成功主要看这里)

3. 安装opencv

三. 测试opencv

四. 解决摄像头分辨率问题

五. opencv实现颜色追踪与识别

六. 可视化hsv色彩空间阈值编辑器

七. 参考链接


一. 使用摄像头

1. 将摄像头连接到我们树莓派

注意:将摄像头的usb口连接到树莓派的任意一个usb口后再开机。一定要先接摄像头再开机,不然树莓派无法识别。

输入lsusb或者ls /dev/video*命令

查看是否有id:05a3:9230 arc international camera或者/dev/video0 设备

有的话说明树莓派已经检测到我们的摄像头设备,可以进行下一步操作

二.升级系统

要使用摄像头模块,你必须使用一个较新的操作系统,它能识别出摄像头模块已连接上。最简单的方法就是直接从树莓派官网去下载一个raspbian的系统镜像然后安装到一个全新的sd卡上。

不管你用的raspbian系统版本是什么,都强烈推荐你用如下的命令来更新一下系统:

  sudo apt-get update

  sudo apt-get upgrade

三.在raspi-config中使能ssh和摄像头服务

sudo raspi-config

选择第5个,按enter键进入配置

 先选择第二个ssh:使能ssh服务(如果已开ssh请忽略此步骤)。

 

接下来选择第一个camera:使能摄像头服务。 

 

重启我们的树莓派。

sudo reboot

二. 安装opencv

本篇文章是针对python3.8 版本以下的python。

1.查看自己系统的python

清华提供的python有两个版本,分别为python 2.7.16 和 python 3.7.3 

2.换源(非常非常重要,成不成功主要看这里)

先在 lx_终端 输入以下代码

sudo nano /etc/apt/sources.list

然后得到如下界面

 将里面的代码注释掉(代码前加 # )或者 直接全部删掉,完成后效果如下

 

  将以下代码粘贴进去

deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib rpi
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib rpi

 随后同时按下 ctrl + x 键,得到如下界面

然后按 y 键,再回车即可,这样就换好一个源了

同理,按照上述步骤更改下一个源
 输入以下代码

sudo nano /etc/apt/sources.list.d/raspi.list

将以下代码粘贴进去

deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui

换源结束,输入以下代码 (这一步一定要有,不然会出错)

sudo apt-get update

3. 安装opencv

上述步骤完成后,输入以下代码(基于python3)

sudo apt-get install python3-opencv -y

出现下面的界面就是安装完成了,如果报错去看一下自己换源了没有,或者源是否正确以及是否 sudo apt-get update

三. 测试opencv

输入: python3

然后再输入: import cv2

四. 解决摄像头分辨率问题

        树莓派上opencv默认读取yuy2格式,所以我们要将视频切换成mjpg格式。且要更改摄像头的分辨率。

# -*- coding: cp936 -*-

"""
author:zhangbo
date:2019-11-07
discription:read camaro picture and save 
"""

import cv2,os,time,datetime
import numpy as np

class camarocap(object):

    """ 打开视频流 """
    def __init__(self):
        
        self.cap = cv2.videocapture(0)
        #self.cap.set(cv2.cap_prop_fps, 120) 这个有时候生效,有时候不生效不知道是什么原因
        self.cap.set(cv2.cap_prop_frame_width, 800)
        self.cap.set(cv2.cap_prop_frame_height, 600)
        self.cap.set(cv2.cap_prop_fourcc, cv2.videowriter_fourcc('m', 'j', 'p', 'g'))

    
    """ 图片信息打印 """      
    def get_image_info(self,image):
        print(type(image))
        print(image.shape)
        print(image.size)
        print(image.dtype)
        pixel_data = np.array(image)
        print(pixel_data)


    """ 逐帧读取数据并保存图片到本地制定位置 """
    def camaro_image(self):
        i = 0
        while(true):
            ret,frame = self.cap.read() #ret:true或者false,代表有没有读取到图片;frame:表示截取到一帧的图片
            if ret == false:
                break
            
            #self.get_image_info(frame) # print("打印图片信息") 注意:调试的时候可以打开,如果是一直运行程序,建议把这行代码注释掉,避免影响内存占用          
            
            cv2.imshow('capture',frame) # 展示图片

            mtime = datetime.datetime.now().strftime('%y-%m-%d_%h_%m_%s')
            print(mtime)
            
            cv2.imwrite(r"d:\image\\" + str(i) + str("-") + mtime + ".jpg",frame)  # 保存图片
            i = i + 1

            if cv2.waitkey(1) & 0xff == ord('q'): 
                break
                
if __name__ == '__main__':

    outmasages = camarocap() 
    
    outmasages.camaro_image() # 调用摄像头
    
    outmasages.cap.release() # 释放对象和销毁窗口
    cv2.destroyallwindows()
    

五. opencv实现颜色追踪与识别

import cv2
import numpy as np #导入库
blue_lower = np.array([100,43,46])
blue_upper = np.array([124,255,255]) #设置颜色区间
cap = cv2.videocapture(0)  #打开摄像头
cap.set(3,640)
cap.set(4,480)  #设置窗口的大小
while 1: #进入无线循环
    ret,frame = cap.read() #将摄像头拍摄到的画面作为frame的值
    frame = cv2.gaussianblur(frame,(5,5),0) #高斯滤波gaussianblur() 让图片模糊
    hsv = cv2.cvtcolor(frame,cv2.color_bgr2hsv) #将图片的色域转换为hsv的样式 以便检测
    mask = cv2.inrange(hsv,blue_lower,blue_upper)  #设置阈值,去除背景 保留所设置的颜色

    mask = cv2.erode(mask,none,iterations=2) #显示腐蚀后的图像
    mask = cv2.gaussianblur(mask,(3,3),0) #高斯模糊
    res = cv2.bitwise_and(frame,frame,mask=mask) #图像合并

    cnts = cv2.findcontours(mask.copy(),cv2.retr_external,cv2.chain_approx_simple)[-2] #边缘检测

    if len(cnts) >0 : #通过边缘检测来确定所识别物体的位置信息得到相对坐标
        cnt = max(cnts,key=cv2.contourarea)
        (x,y),radius = cv2.minenclosingcircle(cnt)
        cv2.circle(frame,(int(x),int(y)),int(radius),(255,0,255),2) #画出一个圆
        print(int(x),int(y))
    else:
        pass
    cv2.imshow('frame',frame) #将具体的测试效果显示出来
    cv2.imshow('mask',mask)
    cv2.imshow('res',res)
    if cv2.waitkey(5) & 0xff == 27: #如果按了esc就退出 当然也可以自己设置
        break

cap.release()
cv2.destroyallwindows() #后面两句是常规操作,每次使用摄像头都需要这样设置一波

六. 可视化hsv色彩空间阈值编辑器

# -*- coding:utf-8 -*-
 
import cv2
import numpy as np
 
"""
功能:读取一张图片,显示出来,转化为hsv色彩空间
     并通过滑块调节hsv阈值,实时显示
"""
 
image = cv2.imread('1.jpg') # 根据路径读取一张图片,opencv读出来的是bgr模式
cv2.imshow("bgr", image) # 显示图片
 
hsv_low = np.array([0, 0, 0])
hsv_high = np.array([0, 0, 0])
 
# 下面几个函数,写得有点冗余
 
def h_low(value):
    hsv_low[0] = value
 
def h_high(value):
    hsv_high[0] = value
 
def s_low(value):
    hsv_low[1] = value
 
def s_high(value):
    hsv_high[1] = value
 
def v_low(value):
    hsv_low[2] = value
 
def v_high(value):
    hsv_high[2] = value
 
cv2.namedwindow('image',cv2.window_autosize)
 
#h low:
#    0:指向整数变量的可选指针,该变量的值反映滑块的初始位置。
#  179:表示滑块可以达到的最大位置的值为179,最小位置始终为0。
#h_low:指向每次滑块更改位置时要调用的函数的指针,指针指向h_low元组,有默认值0。
(此函数的原型应为void xxx (int, void *); ,其中第一个参数是轨迹栏位置,第二个参数是用户数据(请参阅下一个参数)。如果回调是null指针,则不调用任何回调,而仅更新值。)
cv2.createtrackbar('h low', 'image', 0, 179, h_low) 
cv2.createtrackbar('h high', 'image', 0, 179, h_high)
cv2.createtrackbar('s low', 'image', 0, 255, s_low)
cv2.createtrackbar('s high', 'image', 0, 255, s_high)
cv2.createtrackbar('v low', 'image', 0, 255, v_low)
cv2.createtrackbar('v high', 'image', 0, 255, v_high)
 
while true:
    dst = cv2.cvtcolor(image, cv2.color_bgr2hsv) # bgr转hsv
    dst = cv2.inrange(dst, hsv_low, hsv_high) # 通过hsv的高低阈值,提取图像部分区域
    cv2.imshow('dst', dst)
    if cv2.waitkey(1) & 0xff == ord('q'):
        break
cv2.destroyallwindows()

至此,我们就完成了树莓派从镜像烧录到实现颜色识别,这样我们最基础的使用树莓派即完成了

七. 参考链接

1. https://blog.csdn.net/weixin_45911959/article/details/122709090?utm_source=miniapp_weixin

2.https://blog.csdn.net/noamanelson/article/details/103135056

3.https://blog.csdn.net/weixin_43635647/article/details/97397153?utm_source=miniapp_weixin

4. https://blog.csdn.net/luoyir1997/article/details/109159792?utm_source=miniapp_weixin

5. gitee链接分享:

树莓派: 树莓派从镜像烧录到实现颜色识别icon-default.png?t=n7t8https://gitee.com/didiao-hhh/raspberry-pi

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com