m0_73918596 2022-11-16 21:56 采纳率: 0%
浏览 33
已结题

如何将以下两个代码整合在一起,使树莓派循环拍摄的不同命名的灰度照片用socket传到电脑上

想问一下,如何将以下两个代码整合在一起,使树莓派循环拍摄的不同命名的灰度照片用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()


  • 写回答

5条回答 默认 最新

  • 游一游走一走 2022-11-17 11:45
    关注
    获得11.40元问题酬金
    1. 服务端代码整合和修改了一些BUG
    # -*- coding: UTF-8 -*-
    import os
    import socket
    import struct
    import sys
    import threading
    
    
    def socket_service():
        try:
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            s.bind(('', 6666))
            s.listen(10)
        except socket.error as msg:
            print(msg)
            sys.exit(1)
        print("Wait")
        while True:
            sock, addr = s.accept()
            threading.Thread(target=deal_data, args=(sock, addr)).start()
        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:
                    print(filesize - recvd_size)
                    if filesize - recvd_size >= 1024:
                        data = sock.recv(1024)
                        recvd_size += len(data)
                    else:
                        data = sock.recv(filesize - recvd_size)
                        recvd_size = filesize
                    fp.write(data)
                fp.close()
    
    
    if __name__ == '__main__':
        socket_service()
    
    1. 客户端修改问题并进行了整合
    #!coding=utf-8
    import socket
    import os
    import sys
    import struct
    
    
    class SocketClient:
        def __init__(self, ip='192.168.43.228', port=9001):
            try:
                s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                s.connect((ip, port))
                self.s = s
            except socket.error as msg:
                print(msg)
                sys.exit(1)
    
        def sendFile(self, filepath):
            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)
                # 发送文件名称与文件大小
                self.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
                    self.s.send(data)
    
        def close(self):
            self.s.close()
    
    1. 树莓派拍照部分简化并引入客户端
    import os
    import time
    
    import cv2
    from test19 import SocketClient
    
    # 创建实例对象
    cap = cv2.VideoCapture(0)
    client = SocketClient('127.0.0.1', 6666)
    count = 0
    while cap.isOpened():
        y, Array = cap.read()
        count += 1
        fileName = 'test_%d.jpg' % (count % 20)
        cv2.imwrite(fileName, Array)
        client.sendFile(fileName)
        os.remove(fileName)
        time.sleep(10)
    
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 11月24日
  • 创建了问题 11月16日