2016-02-08 18:47:33 KarlFreecss 阅读数 8695
  • 树莓派+python 系统部分

    本课程主要讲如何安装树莓派操作系统,如何采购树莓派,如何联网,笔记本如何控制,树莓派如何共享网盘,桌面共享,如何使用souceinsight,如何使用Pycharm进行写代码

    881 人正在学习 去看看 程光淼

树莓派_图像处理入门纪实(一)
先声明一点,凡是以纪实为文章标题的博客都是在强调:我只是向老板/领导/老师/同事/同学证明,我确实干活了。等把纪实的任务完成,会整理出一篇总结,把纪实中涉及的内容,用类似于教程的方法写下来。

前面已经准备好的事情:
- 设置好树莓派,升级相关软件
- 安装好OpenCV的相关库,我安装的是OpenCV3.1.0
- 确定摄像头和树莓派是兼容的

在OpenCV官网上找到了一些比较有用的信息。OpenCV使用视频,比较方便的方法是用VideoCapture类来实现。官网中给出了调用一个摄像头的例子:

#include "opencv2/opencv.hpp"
using namespace cv;
int main(int, char**)
{
    VideoCapture cap(0); // 使用默认摄像头
    if(!cap.isOpened())  // 检查摄像头是否成功打开
        return -1;
    Mat edges;
    namedWindow("edges",1); //建立一个窗口
    for(;;)
    {
        Mat frame;
        cap >> frame; // 获得摄像头的一帧
        //下面三句代码是利用canny算子进行边缘检测
        cvtColor(frame, edges, COLOR_BGR2GRAY);
        GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5);
        Canny(edges, edges, 0, 30, 3);
        imshow("edges", edges);  //在名字为“edges”的窗口显示
        if(waitKey(30) >= 0) break;
    }
    // the camera will be deinitialized automatically in VideoCapture destructor
    return 0;
}

代码的运行效果图

从官网上可以看出,VideoCapture类由一下成员函数可以调用:

//filename表示要打开的文件名,index表示要打开的摄像头编号(实验了一下,树莓派基本是从0开始编号的)
        VideoCapture ()
        VideoCapture (const String &filename)
        VideoCapture (const String &filename, int apiPreference)
        VideoCapture (int index)
virtual     ~VideoCapture ()
virtual double  get (int propId)
virtual bool    grab ()
virtual bool    isOpened () const
virtual bool    open (const String &filename)
virtual bool    open (int index)
virtual bool    open (const String &filename, int apiPreference)
virtual VideoCapture &  operator>> (Mat &image)
virtual VideoCapture &  operator>> (UMat &image)
virtual bool    read (OutputArray image)
virtual void    release ()
virtual bool    retrieve (OutputArray image, int flag=0)
virtual bool    set (int propId, double value)

作为一个比较用于尝试的人,我还真的把上面的代码改造成双摄像头的,可惜失败了,内存消耗大的诡异。系统已经开始提示内存不足了。
目前发现的几个还没解决的问题:
- 无法成功使用双摄像头
- 图片颜色显示不正确
- 图片头尾位置不正确

2019-03-07 19:40:35 qq_38237827 阅读数 153
  • 树莓派+python 系统部分

    本课程主要讲如何安装树莓派操作系统,如何采购树莓派,如何联网,笔记本如何控制,树莓派如何共享网盘,桌面共享,如何使用souceinsight,如何使用Pycharm进行写代码

    881 人正在学习 去看看 程光淼

使用opencv对图像处理
树莓派相关库安装:

sudo apt-get update
sudo apt-get install libjpeg-dev
sudo apt-get install libatlas-base-dev
sudo apt-get install libjpeg-dev
sudo apt-get install libtiff5-dev
sudo apt-get install libpng12-dev
sudo apt-get install libqtgui4 libqt4-test
sudo apt-get install libjasper-dev

10、OpenCV模块pip安装

sudo pip3 install opencv-python

• 测试
在终端输入 :python3
然后 :import cv2
如果安装成功,则import不会有问题
下面就可以输出OpenCv的版本号
使用 :print(cv2.version)
退出python用: exit()

import cv2
import numpy as np

cap = cv2.VideoCapture(0)
while(1):
    # get a frame
    ret, frame = cap.read()
    # show a frame
    cv2.imshow("capture", frame)
       
    if cv2.waitKey(1) & 0xFF == ord('q'):
    #退出并拍照
        cv2.imwrite("takephoto2.jpg", frame)
        print("take Photo Ok")
        break
cap.release()
cv2.destroyAllWindows()

树莓派实现·本地抓拍保存到picam里面

2019-08-02 10:56:31 gengli2017 阅读数 207
  • 树莓派+python 系统部分

    本课程主要讲如何安装树莓派操作系统,如何采购树莓派,如何联网,笔记本如何控制,树莓派如何共享网盘,桌面共享,如何使用souceinsight,如何使用Pycharm进行写代码

    881 人正在学习 去看看 程光淼

用树莓派,想要进行图像处理,但网上的很多教程都用opencv,opencv在树莓派上安装很麻烦,那怎样进行图像处理呢?
代码如下:

from picamera.array import PiRGBArray
from picamera import PiCamera
import time

# 下面几行初始化,设置一下参数
camera = PiCamera()
camera.resolution = (640, 480)
camera.framerate = 32

rawCapture = PiRGBArray(camera, size=(640,480))

# 关键用capture_continuous()函数进行读取视频,然后 array 去除视频
# image是numpy数组,就可以进行相关处理了

for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port$
    image = frame.array
    print(image.shape)
    rawCapture.truncate(0)
2019-05-20 18:31:46 chenhaogxfc 阅读数 477
  • 树莓派+python 系统部分

    本课程主要讲如何安装树莓派操作系统,如何采购树莓派,如何联网,笔记本如何控制,树莓派如何共享网盘,桌面共享,如何使用souceinsight,如何使用Pycharm进行写代码

    881 人正在学习 去看看 程光淼
  • 概述

本文实现了一种基于树莓派+python3+opencv3方法实现实时网络视频监控(局域网内)。现将实现过程中才过的坑(对我这个新手来说是坑)与大家分享,我将在代码实现章节进行详细说明。

  • 功能实现

树莓派链接USB摄像头,以树莓派作为服务器,笔记本电脑作为客户端。客户端通过网络实时查看树莓派的摄像头连接的视频图像。


  • 硬件型号

树莓派3B+,USB摄像头,笔记本电脑,路由器。


  • 软件环境版本

python3.6.4 , opencv3.4.0。

特别要注意版本号,参考文章使用的是python2与opencv2及opencv3混合在一起写的程序。对于python3环境下,有一些代码无法使用,尤其是 io.StringIO 与 io.BytesIO的使用方法。python3更加准确的区分了字节串与字符串的关系。对内存操作部分,参考文章1中的StringIO在Python3环境下运行错误,至少我试验的时候是报错的。如果说的不对,请各位见谅。

本文参考了以下文章,感谢各位  :)

1.https://blog.csdn.net/shukebeta008/article/details/79335299#commentBox

2.https://blog.csdn.net/qq_39290394/article/details/84696100

3.https://stackoverflow.com/questions/21018654/strings-in-a-dataframe-but-dtype-is-object


  • 代码组成

代码主要分为三个部分,服务器代码server.py,客户端代码dst.py,视频源代码scr.py。

其中,scr.py负责采集USB摄像头信息,通过网络发送给服务器server.py,然后服务器server.py再发送给scr.py,在scr.py中显示图像。


  • 代码实现

scr.py 源代码如下。

网络套接字的常规使用,视频读取方式没什么可说的,都是基本操作。

这里涉及到一个由 opencv 格式 转 PIL 格式的图像转换,由 BGR 转换为 RGB。

pi = Image.fromarray(cv2.cvtColor(frame,cv2.COLOR_BGR2RGB))

另外,需要注意的是Image与BytesIO的导入方式,与python2有所不同。并且参考文章中是使用 io.StringsIO 作为图像加载内存的方式,实际在python3中会报错。后改为 io.BtyesIO 方式。可见python3更加准确的区分了字符串与字节串的使用方式。

import cv2
import time
import socket
from PIL import Image
from io import BytesIO
import numpy as np


# 获取摄像头
cap = cv2.VideoCapture(0)
# 调整采集图像大小为640*480
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

# 这里的HOST对应树莓派的IP地址(自己输入ifconfig查),端口号自己随便定一个即可,但注意后面的程序中要保持统一
HOST, PORT = '192.168.1.118', 9999
# 连接服务器
sock =socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))

while True:
    # 获取一帧图像
    ret, frame = cap.read()
    # 如果ret为false,表示没有获取到图像,退出循环
    if ret is False:
        print("can not get this frame")
        continue    

    # 将opencv下的图像转换为PIL支持的格式
    pi = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
   
    buf = BytesIO()# 缓存对象
    
    pi.save(buf, format='JPEG')# 将PIL下的图像压缩成jpeg格式,存入buf中

    jpeg = buf.getvalue()# 从buf中读出jpeg格式的图像

    buf.close()

    sock.send(jpeg)# 通过socket传到服务器
    # time.sleep(0.2)

sock.close()

server.py 源代码如下。都是基本的服务器端常规代码,也没啥好说的。

import socket
import numpy as np
import cv2

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(("192.168.1.118", 9999))# 注意bind的这里,IP地址和端口号都要与前面的程序中一样
sock.listen(2)# 监听端口

# 等待数据源端连接
src, src_addr = sock.accept()
print ("Source Connected by", src_addr)

# 等待目标端连接
dst, dst_addr = sock.accept()
print ("Destination Connected by", dst_addr)

while True:
    msg = src.recv(1024 *1024)

    if not msg:
        break
    try:
        dst.send(msg)
    except Exception as ex:
        dst, dst_addr = sock.accept()
        print ("Destination Connected Again by", dst_addr)
    except KeyboardInterrupt:
        print ("Interrupted")
        break

src.close()
dst.close()
sock.close()

dst.py 源代码如下。

在运行过程中经常出现如下错误。

img = cv2.cvtColor(np.asarray(img_array), cv2.COLOR_RGB2BGR)

TypeError: src data type = 17 is not supported

上网查资料,由于 cv2.cvtColor(np.asarray(img_array), cv2.COLOR_RGB2BGR) 语句中的 img_array.dtype 在运行中偶尔会出现 被定义为 object 的类型,而正确的 img_array.dtype 应该为 uint8,所以就加了一层判断语句,当对象类型为 objec 时,将其转为 uint8 类型。这样就可以顺利运行了。

# -*- coding:utf-8 -*-

import cv2
import socket
import time
from PIL import Image
from io import BytesIO
import numpy as np

# 注意IP地址和端口号与前面的程序中的保持一致
HOST, PORT = "192.168.1.118", 9999
# 连接到服务器
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))

while True:
        msg = sock.recv(1024*1024)
        if not msg:
            break
        buf = BytesIO(msg)
        buf.seek(0)
        try:
                pi = Image.open(buf)# 使用PIL读取jpeg图像数据

                img_array = np.array(pi)
                if img_array.dtype == object:
                        img_array = img_array.astype(uint8)
                print(img_array.dtype)
                
                img = cv2.cvtColor(np.asarray(img_array), cv2.COLOR_RGB2BGR)
                
                cv2.imshow("camera", img)# 实时显示
        except(OSError, NameError):
                print('OSError')
       
        if cv2.waitKey(10) == ord('q'):
                break

sock.close()
cv2.destroyAllWindows()

以上代码的运行次序为  1. server.py   2.  scr.py  3. dst.py 


  • 运行效果

  • 遗留的问题

我首先将三个代码都放在树莓派上运行,没有丢帧的现象。

但是,当我把 server.py 与 scr.py 放在树莓派上, dst.py 放在笔记本电脑上运行时,电脑采集的视频有时候会丢帧。导致输出 OSError。如下图所示。其中输出 “uint8 dsd”  为正常捕获的视频流。 “OSError” 就为丢帧。我还没有完全解决这个问题。希望有兄弟知道原因的能告知一下。谢谢!

 

2017-06-21 08:23:05 helloworld_Fly 阅读数 307
  • 树莓派+python 系统部分

    本课程主要讲如何安装树莓派操作系统,如何采购树莓派,如何联网,笔记本如何控制,树莓派如何共享网盘,桌面共享,如何使用souceinsight,如何使用Pycharm进行写代码

    881 人正在学习 去看看 程光淼

       项目要求利用树莓派进行视频传输和图像处理,利用手头的树莓派3完成,任务艰巨,撸起袖子加油干!

1.系统烧录

       利用官方软件Win32DiskImager或者usbit均可,树莓派系统使用的是2016-05-27的raspbian-jessie.烧录过程网上资料很多,不再赘述。(记得烧录前格式化SD卡)


2.安装中文输入法和中文字体

因我用的官方屏幕,启动后需要将屏幕翻转180°,打开终端Terminal,输入一下指令:

sudo nano /boot/config.txt
    在最后一行输入:

lcd_rotate=2
    重启树莓派后,进入终端,输入下列命令:
sudo apt-get install ttf-wqy-zenhei ttf-wqy-microhei xfonts-wqy
sudo apt-get install scim-pinyin
    分别安装中文字体和中文拼音输入法,在树莓派系统设置里找到语言设置选项,选择中文,设置好时间重启系统即可。


3.摄像头显示和视频传输

      手头有官方摄像头和一个USB摄像头,准备都用上。

       先进行windows远程桌面连接,用PC电脑直接控制树莓派方便。需在树莓派安装软件,命令如下:

sudo apt-get install xrdp
           在电脑中搜索“远程桌面连接”,打开后输入树莓派IP,进入后输入账号:pi,密码:raspberry,即可连接成功。

       如果是使用USB摄像头观看视频,可直接安装软件luvcview:

sudo apt-get insall luvcview
       启动只需在终端输入:luvcview即可。

       官方摄像头有直接的调用命令:raspistill和raspivid,分别执行拍照和视频拍摄功能,可以help了解详细指令。

       网上查找资料后,推荐使用mjpg-stream进行网络视频监控,调用USB摄像头和官方摄像头均可,并进行网络传输和监控,且画面稳定流畅。


第一步:安装支持库:

sudo apt-get update
sudo apt-get install subversion
sudo apt-get install libjepg8-dev
sudo apt-get install imagemagick
sudo apt-get install libv4l-dev
sudo apt-get install cmake
sudo apt-get install git


第二步:安装开源软件megp-stream
sudo git clone https://github.com/jacksonliam/mjpg-streamer.git
cd mjpg-streamer/mjpg-streamer-experimental
make all
sudo make install
普通UBS摄像头,可以通过如下命令调用:

./mjpg_streamer -i "./input_uvc.so" -o "./output_http.so -w ./www"
官方摄像头因为V4L driver 不支持raspberry pi的camera,所以初始化失败。继续如下步骤:


安装依赖库:

sudo wget http://www.linux-projects.org/listing/uv4l_repo/lrkey.asc && sudo apt-key add ./lrkey.asc
修改sources.list

sudo nano /etc/apt/sources.list
最后一行加入:
deb http://www.linux-projects.org/listing/uv4l_repo/raspbian/ wheezy main
继续安装:

sudo apt-get update
sudo apt-get install uv4l uv4l-raspicam
sudo reboot
重启之后:
sudo pkill uv4l
sudo apt-get update
sudo apt-get install uv4l-uvc
sudo apt-get install uv4l-xscreen
sudo apt-get install uv4l-mjpegstream
sudo reboot
重启之后:
sudo modprobe bcm2835-v4l2
./mjpg_streamer -i "./input_uvc.so -d /dev/video0 -n -y -f 25 -r 640x480" -o "./output_http.so -n -w /usr/local/www"
最后打开浏览器,输入:

http://raspberry-ip-address:8080/?action=stream

即可看到树莓派官方摄像头传输过来的网络视频咯!



参考文献:

http://shumeipai.nxez.com/2017/05/14/raspberry-pi-mjpg-streamer-installation.html点击打开链接


关于树莓派

阅读数 208

没有更多推荐了,返回首页