想问一下,如何将以下两个代码整合在一起,使树莓派循环拍摄的不同命名的灰度照片用socket传到电脑上(大一刚接触编程)
1.灰度照片
import cv2
import time
import os
import datetime
import numpy as np
img_size = 48
emo_labels = ['angry', 'disgust', 'fear', 'happy', 'sad', 'surprise', 'neutral']
num_class = len(emo_labels)
cap = cv2.VideoCapture(0) # 生成读取摄像头对象
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) # 获取视频的宽度
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 获取视频的高度
fps = cap.get(cv2.CAP_PROP_FPS) # 获取视频的帧率
frames = cap.get(cv2.CAP_PROP_FRAME_COUNT)
count = 0
while cap.isOpened():
ret, frame = cap.read() # 读取摄像头画面
count += 1
if count % 20 == 0:
# 图像灰化,降低计算复杂度
frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 使用人脸识别分类器,读入分类器
cascade_path ='/home/pi/Desktop/zhuanzhudu/PycharmProjectsOpencv/venv/Lib/site-packages/cv2/data/haarcascade_frontalface_alt.xml'
cascade = cv2.CascadeClassifier(cascade_path)
# 利用分类器识别出哪个区域为人脸
faceRects = cascade.detectMultiScale(frame_gray, scaleFactor=1.1, minNeighbors=2, minSize=(120, 120))
if len(faceRects) > 0:
for faceRect in faceRects:
x, y, w, h = faceRect
images = []
#rs_sum = np.array([0.0] * num_class)
# 截取脸部图像提交给模型识别表情
image = frame_gray[y: y + h, x: x + w] # 灰度处理
# cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
# src:[必需]原图像
# dsize:[必需]输出图像所需大小
# fx:[必需]沿水平轴的比例因子
# fy:[必需]沿垂直轴的比例因子
# interpolation:[必需]插值方式
image = cv2.resize(image, (img_size, img_size)) # 将灰度处理后的图像按比例调整为像素大小48*48
''' image = image * (1. / 255)
images.append(image) # 在末尾添加新的图片
images.append(cv2.flip(image, 1))
images.append(cv2.resize(image[2:45, :], (img_size, img_size)))'''
cv2.imwrite('/home/pi/Desktop/img/test%d.jpg' % (count/20), image)
cv2.imshow('video', frame) # 显示画面
key = cv2.waitKey(22)
print(ret, fps)
# 按Q退出
if key == ord('q'):
break
img = cv2.imread('20211217201334_69c97.png')
cv2.imshow('img', img)
cv2.waitKey(10300)
2.树莓派客户端
#!coding=utf-8
import socket
import os
import sys
import struct
def socket_client():
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('192.168.43.228', 9001))
except socket.error as msg:
print (msg)
sys.exit(1)
print (s.recv(1024))
# 需要传输的文件路径
filepath = '/home/pi/Desktop/img/test1.jpg'
# 判断是否为文件
if os.path.isfile(filepath):
# 定义定义文件信息。128s表示文件名为128bytes长,l表示一个int或log文件类型,在此为文件大小
fileinfo_size = struct.calcsize('128sl')
# 定义文件头信息,包含文件名和文件大小
fhead = struct.pack('128sl', os.path.basename(filepath).encode('utf-8'), os.stat(filepath).st_size)
# 发送文件名称与文件大小
s.send(fhead)
# 将传输文件以二进制的形式分多次上传至服务器
fp = open(filepath, 'rb')
while 1:
data = fp.read(1024)
if not data:
print ('{0} file send over...'.format(os.path.basename(filepath)))
break
s.send(data)
# 关闭当期的套接字对象
s.close()
if __name__ == '__main__':
socket_client()
3.pc端
# -*- coding: UTF-8 -*-
import os
import socket
import struct
import sys
def socket_service():
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('192.168.43.228', 6666))
s.listen(10)
except socket.error as msg:
print(msg)
sys.exit(1)
print("Wait")
while True:
sock, addr = s.accept()
deal_data(sock, addr)
break
s.close()
def deal_data(sock, addr):
print("Accept connection from {0}".format(addr))
while True:
fileinfo_size = struct.calcsize('128sl')
buf = sock.recv(fileinfo_size)
if buf:
filename, filesize = struct.unpack('128sl', buf)
fn = filename.decode().strip('\x00')
new_filename = os.path.join('./', 'new_' + fn)
recvd_size = 0
fp = open(new_filename, 'wb')
while not recvd_size == filesize:
if filesize - recvd_size > 1024:
data = sock.recv(1024)
recvd_size += len(data)
else:
data = sock.recv(1024)
recvd_size = filesize
fp.write(data)
fp.close()
sock.close()
break
if __name__ == '__main__':
socket_service()