admin 管理员组

文章数量: 887021

某节嵌入式开发与应用的大作业,需要我们做一个实物出来,鉴于自己装(朦)逼(胧)心(无)理(知),接下老师配发的raspberry pi 4,准备接上摄像头,做一个图像识别。

 

首先拿到老师给的树莓派,满怀激动地将它组装起来,然后发现用网线和我的笔记本连接不上。。。

???

于是老师的系统有问题,https://www.raspberrypi/downloads/raspbian/ ,咱换个系统的说

我选的是第一个full的版本,当然直接选择lite轻便版的也是可以的。(因为不管哪个版本,网线+笔记本=null,所以就直接来个full,然后借隔壁大神的显示屏,沾沾福气)

怎么换系统呢,先是SDFormatter格式化SD卡,然后Win32DiskImager将下载下来Raspbian系统的img文件烧录至SD卡

坑一:注意盘符

(个人友情提醒:看好SD卡的盘符,格式化错的话,会哭的),当然要注意系统的版本,像我的full就需要登录才可以进入desktop,所以没有显示屏的童鞋选lite或者再额外设置吧。

有的童鞋肯定疑问,有显示屏了,还需要费劲连接电脑嘛,不是多此一举嘛?

坑二:插口问题?

因为现实告诉我:raspberry pi 4 是需要hdmi转接口的,拔插多了,它就没用了(这里的疑惑也希望有大佬指点一下,为什么接线什么都没问题,却显示不出界面呢),对,用多了,它就不显示(有一种猜测是系统的问题,和硬件有冲突?)

总之,它就是不显示,所以我只能指望用通过局域网来远程操控了吧。

坑三:windows问题?

网上有很多网线和笔记本一连就可以putty上的教程,如果你的树莓派很优质的话,你可以走了,这篇文章基本没什么用了...(来自败犬的怨念),我的网线不管怎么连,树莓派的小黄灯该怎么黄就怎么黄,一点都不绿(个人觉得可能是因为企业版的网络比较严谨?本家舍友家庭版就完全没问题?也希望大佬解惑,自家电脑就是没法给树莓派分配网址,arp一点结果都没有

网上冲浪结束以后,只能采用迂回战略,路由器直插到树莓派,电脑再连上路由器的wifi。这样同一个局域网下,互联不是很正常嘛...ping没问题,putty没问题,那就vnc吧,我可是有桌面的人啊!
vnc,一个优秀的远程控制工具软件,大家都用咧,而且vnc和ssh在我下的系统上都是自带。如果没有的话,大家自行百度怎么安装吧。

sudo raspi-config
选中Interfacing Optiojns 
选中vnc(不要立即重启!)

 

完美桌面

坑四:vnc连接不上

vnc连接上了,突然,额,关机以后再开机,连接vnc就连接不上了?

如果连接不上,记得更改分辨率!(所以最好第一次连接的时候就设置好分辨率,调大的吧)

坑五:不要重启!

有没有注意到,我没提到重启两个字...der,没提,因为提了的我都去重烧系统了...原因未知,可能是系统的问题吧,重启就开机不了了,连接连不上,接显示屏也没得显示...只能重来...(更新的系统应该就没问题了?)

所以建议大家插着U盘,有什么文件直接备份,什么命令在U盘里建个文件保存一下,以防万一...

sudo mkdir /mnt/udisk
sudo apt-get install exfat-fuse
sudo mount -o uid=pi,gid=pi /dev/sda1 /mnt/udisk

umount /mnt/udisk

当可以完美控制树莓派了,那就开始浪吧。

我的任务是啥?基于树莓派的图像识别处理系统~(其实就是树莓派+摄像头...没了)

然后就是连接摄像头啦~(就是普通的CSI摄像头,加点钱,买了一个配套的支架,又向店家要了配套资料,五星好评~)

硬件连接好了,就设置一下,开启摄像头,敲一下键盘的事~

sudo raspi-config
选中Interfacing Optiojns 
选中camera

然后就可以开摄像头,录视频啦(这些东东找店家要就好啦,也防止型号什么的错误)

1.1 1秒钟(时间单位为毫秒)延迟后拍摄一张照片,并命名为image.jpg
    raspistill -t 1000 -o image.jpg
1.2 拍摄一张自定义大小和帧率的照片
    raspistill -t 1000 -o image.jpg -w 640 -h 480 -q 5


2.1 拍摄一段视频:默认是视频长度为5s,分辨率为1920*1080,帧率:17
    raspivid -o myvideo.h264
2.2 拍摄一段视频:分辨率为640*480 时间为10s
    raspivid -o myvideo.h264  -t 10000 -w 640 -h 480

注:
raspivid输出的是一段未压缩的H.264视频流。为了能让我们普通的视频播放器播放需要安装gpac包
sudo apt-get install -y gpac
然后利用gpac包中的MP4Box应用将H.264格式的视频流转换为每秒10帧的MP4格式的视频
MP4Box -fps 10 -add myvideo.h264 myvideo.mp4

 摄像头ok了,那就该谈到opencv了,毕竟是直接用它的库函数嘛。

https://wwwblogs/zjutlitao/p/8261688.html ,人家大佬写的吧,完整的好像)

但是,本家只是用到基础的cv,没有用到那么高深的...额,好吧,我就是菜,make一堆error。

sudo apt-get install python3-opencv

当然啦,如果系统自带的是python2,就需要自己装一下python3,并设置3为默认(删除原python链接文件,then新建链接文件到python3)

sudo apt-get install python3 
sudo apt-get install python3-pip

sudo rm /usr/bin/python
sudo ln -s /usr/bin/python3 /usr/bin/python

python --version

用的是opencv自带的camshift算法,嗯,基本什么都没改,就是把自己的camera作为camshift的视频源...(改进的在路上,下次一定)

#!/usr/bin/env python

'''
Camshift tracker
================
This is a demo that shows mean-shift based tracking
You select a color objects such as your face and it tracks it.
This reads from video camera (0 by default, or the camera number the user enters)
[1] http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.14.7673
Usage:
------
    camshift.py [<video source>]
    To initialize tracking, select the object with mouse
Keys:
-----
    ESC   - exit
    b     - toggle back-projected probability visualization
'''

# Python 2/3 compatibility
from __future__ import print_function
import sys
PY3 = sys.version_info[0] == 3

if PY3:
    xrange = range

import numpy as np
import cv2 as cv

# local module
#import video
#from video import presets


class App(object):
    def __init__(self):
        self.cam = cv.VideoCapture(0)
        _ret, self.frame = self.cam.read()
        cv.namedWindow('camshift')
        cv.setMouseCallback('camshift', self.onmouse)

        self.selection = None
        self.drag_start = None
        self.show_backproj = False
        self.track_window = None

    def onmouse(self, event, x, y, flags, param):
        if event == cv.EVENT_LBUTTONDOWN:
            self.drag_start = (x, y)
            self.track_window = None
        if self.drag_start:
            xmin = min(x, self.drag_start[0])
            ymin = min(y, self.drag_start[1])
            xmax = max(x, self.drag_start[0])
            ymax = max(y, self.drag_start[1])
            self.selection = (xmin, ymin, xmax, ymax)
        if event == cv.EVENT_LBUTTONUP:
            self.drag_start = None
            self.track_window = (xmin, ymin, xmax - xmin, ymax - ymin)

    def show_hist(self):
        bin_count = self.hist.shape[0]
        bin_w = 24
        img = np.zeros((256, bin_count*bin_w, 3), np.uint8)
        for i in xrange(bin_count):
            h = int(self.hist[i])
            cv.rectangle(img, (i*bin_w+2, 255), ((i+1)*bin_w-2, 255-h), (int(180.0*i/bin_count), 255, 255), -1)
        img = cv.cvtColor(img, cv.COLOR_HSV2BGR)
        cv.imshow('hist', img)

    def run(self):
        while True:
            _ret, self.frame = self.cam.read()
            vis = self.frame.copy()
            hsv = cv.cvtColor(self.frame, cv.COLOR_BGR2HSV)
            mask = cv.inRange(hsv, np.array((0., 60., 32.)), np.array((180., 255., 255.)))

            if self.selection:
                x0, y0, x1, y1 = self.selection
                hsv_roi = hsv[y0:y1, x0:x1]
                mask_roi = mask[y0:y1, x0:x1]
                hist = cv.calcHist( [hsv_roi], [0], mask_roi, [16], [0, 180] )
                cv.normalize(hist, hist, 0, 255, cv.NORM_MINMAX)
                self.hist = hist.reshape(-1)
                self.show_hist()

                vis_roi = vis[y0:y1, x0:x1]
                cv.bitwise_not(vis_roi, vis_roi)
                vis[mask == 0] = 0

            if self.track_window and self.track_window[2] > 0 and self.track_window[3] > 0:
                self.selection = None
                prob = cv.calcBackProject([hsv], [0], self.hist, [0, 180], 1)
                prob &= mask
                term_crit = ( cv.TERM_CRITERIA_EPS | cv.TERM_CRITERIA_COUNT, 10, 1 )
                track_box, self.track_window = cv.CamShift(prob, self.track_window, term_crit)

                if self.show_backproj:
                    vis[:] = prob[...,np.newaxis]
                try:
                    cv.ellipse(vis, track_box, (0, 0, 255), 2)
                except:
                    print(track_box)

            cv.imshow('camshift', vis)

            ch = cv.waitKey(5)
            if ch == 27:
                break
            if ch == ord('b'):
                self.show_backproj = not self.show_backproj
        cv.destroyAllWindows()


if __name__ == '__main__':
    print(__doc__)
    import sys

    App().run()

 

 

某些工具:
链接:https://pan.baidu/s/1O15hf_5-VAQLK9EmAA6qlQ 
提取码:3dhf

 

最终成果

 

 


本篇博客到此就结束了,各位看官看到这也就结束了。其实大家也发现没什么干货,只是个人的败犬吐槽而已。硬件嘛,总是多出好多不确定因素。

努力,不能做一个让自己都嫌弃的人啊。

 

 

本文标签: 电脑 树莓派 amp camshift Raspbian