周四去测蚌的一些准备事宜


VNC服务

先用自带的虚拟键盘安装一个虚拟键盘。

sudo apt install matchbox-keyboard

插上屏幕,查看ip,电脑和树莓派在同一个子网。

sudo raspi-config

按照这篇文章来配置。

摄像头usb口设置

lsusb

image-20220302131346302

固定usb映射:

KERNEL=="video*",KERNELS=="1-1.3:1.0", MODE:="0777",ATTR{index}=="0", SYMLINK+="lt_camera"
KERNEL=="video*", KERNELS=="1-1.2:1.0" , MODE:="0777", ATTR{index}=="0", SYMLINK+="rb_camera"
KERNEL=="video*", KERNELS=="1-1.1:1.0", MODE:="0777", ATTR{index}=="0",SYMLINK+="rt_camera"
KERNEL=="video*", KERNELS=="1-1.4:1.0", MODE:="0777",ATTR{index}=="0", SYMLINK+="lb_camera"

然后重启服务:

sudo /etc/init.d/udev restart

然后就可以发现video*无论怎么变,端口都有一个自己的名字。

image-20220302132208929

上传图片

改成了多线程版本,应是可用的。

暂时先用我自己的服务器。lighttpd已经开启了,

http://42.193.121.128:12345/查看图片,server.py只是把文件放入到这个文件夹。

服务器文件夹位于hqinglau的~/camera文件夹下,server_img.py关闭了数据库,只是上传图片。

服务端:

image-20220302123251205

客户端:

image-20220302123328524

可能要安装python3。

sudo apt install python3

client.py

#-*-coding:utf-8-*-
import socket
import cv2
import numpy
import sys
import time
 
# 图片信息,如指定编号
def SendImg(imgMsg):
    #建立sock连接
    #address要连接的服务器IP地址和端口号
    address = ('42.193.121.128', 10086)
    try:
        #socket.AF_INET:服务器之间网络通信 
        #socket.SOCK_STREAM:流式socket , for TCP
        sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        #开启连接
        sock.connect(address)
    except socket.error as msg:
        print(msg)
        sys.exit(1)
 
    #建立图像读取对象
    capture = cv2.VideoCapture("/dev/lt_camera")
    ret,frame_lt = capture.read()
    capture.release()
    
    capture = cv2.VideoCapture("/dev/lb_camera")
    ret,frame_lb = capture.read()
    capture.release()
    
    capture = cv2.VideoCapture("/dev/rt_camera")
    ret,frame_rt = capture.read()
    capture.release()
    
    capture = cv2.VideoCapture("/dev/rb_camera")
    ret,frame_rb = capture.read()
    capture.release()
    
    
    encode_param=[int(cv2.IMWRITE_JPEG_QUALITY),50]
 
    for frame in [frame_lt,frame_lb,frame_rt,frame_rb]:
        #停止0.1S 防止发送过快服务的处理不过来,如果服务端的处理很多,那么应该加大这个值
        time.sleep(0.1)
        #cv2.imencode将图片格式转换(编码)成流数据,赋值到内存缓存中;主要用于图像数据格式的压缩,方便网络传输
        #'.jpg'表示将图片按照jpg格式编码。
        result, imgencode = cv2.imencode('.jpg', frame, encode_param)
        #建立矩阵
        data = numpy.array(imgencode)
        #将numpy矩阵转换成字符形式,以便在网络中传输
        stringData = data.tostring()
        
        #先发送要发送的数据的长度
        #ljust() 方法返回一个原字符串左对齐,并使用空格填充至指定长度的新字符串
        sock.send(str.encode(str(len(stringData)).ljust(16)));
        
        #图片信息如图片名
        sock.send(str.encode(imgMsg).ljust(16));
        #发送数据
        sock.send(stringData);
    sock.close()
    
if __name__ == '__main__':
    SendImg("1234567")

协议

串行、并行、树莓派依次。。