周四去测蚌的一些准备事宜
VNC服务
先用自带的虚拟键盘安装一个虚拟键盘。
sudo apt install matchbox-keyboard
插上屏幕,查看ip,电脑和树莓派在同一个子网。
sudo raspi-config
按照这篇文章来配置。
摄像头usb口设置
lsusb
固定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*
无论怎么变,端口都有一个自己的名字。
上传图片
改成了多线程版本,应是可用的。
暂时先用我自己的服务器。lighttpd已经开启了,
http://42.193.121.128:12345/查看图片,server.py只是把文件放入到这个文件夹。
服务器文件夹位于hqinglau的~/camera
文件夹下,server_img.py关闭了数据库,只是上传图片。
服务端:
客户端:
可能要安装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")
协议
串行、并行、树莓派依次。。