使用socket客户端实现非阻塞收发数据

该代码实现了一个测试客户端,通过socket连接到服务器,并使用opencv处理摄像头视频流。它能进行非阻塞IO操作,根据服务器指令切换摄像头或发送坐标数据。程序还包含了红球检测功能,用于追踪目标物体的运动。
摘要由CSDN通过智能技术生成
import socket
from collections import deque
import numpy as np
import cv2
import time
import select


def TestClient():
    server_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_client.connect(("192.168.10.103", 19999))


    # 初始化摄像头
    camera1 = cv2.VideoCapture(0)
    #camera2 = cv2.VideoCapture(1)
    current_camera = camera1

    redLower = np.array([156, 43, 46])
    redUpper = np.array([180, 255, 255])
    mybuffer = 64
    pts = deque(maxlen=mybuffer)

    index = 2
    data = 0
    while True:  # 遍历每一帧
        # 使用 select 模块进行非阻塞 IO
        ready_to_read, _, _ = select.select([server_client], [], [], 0)

        if ready_to_read:
            # 接收服务端发送的数据并解码
            data = server_client.recv(1024).decode()
            print(data)

        # 根据接收到的数据切换摄像头
        # if data == 'switch':
        # if current_camera == camera1:
        # current_camera = camera2
        # else:
        # current_camera = camera1

        # 从当前摄像头读取每一帧
        (ret, frame) = current_camera.read()
        if not ret:
            print('No Camera')
            break
        gs_frame = cv2.GaussianBlur(frame, (5, 5), 0)
        hsv = cv2.cvtColor(gs_frame, cv2.COLOR_BGR2HSV)
        mask = cv2.inRange(hsv, redLower, redUpper)
        mask = cv2.erode(mask, None, iterations=2)
        mask = cv2.dilate(mask, None, iterations=2)
        cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
        center = None
        if len(cnts) > 0:
            c = max(cnts, key=cv2.contourArea)
            ((center_x, center_y), radius) = cv2.minEnclosingCircle(c)
            M = cv2.moments(c)
            cx = int(M['m10'] / M['m00'])
            cy = int(M['m01'] / M['m00'])
            cv2.circle(frame, (int(center_x), int(center_y)), int(radius), (0, 255, 255), 2)
            cv2.circle(frame, center, 5, (0, 0, 255), -1)
            cv2.line(frame, (cx - 10, cy), (cx + 10, cy), (255, 0, 0), 2)
            cv2.line(frame, (cx, cy - 10), (cx, cy + 10), (255, 0, 0), 2)
            delta_x = 320 - int(center_x)
            delta_y = 240 - int(center_y)
            if data == '0':
                pass
            if data == '1':
                server_client.send(f"({delta_x},{delta_y})".encode('utf-8'))
                print(f"({delta_x},{delta_y})")
            # time.sleep(0)  # 等待2秒
        cv2.imshow('Frame', frame)
        k = cv2.waitKey(5) & 0xFF  # 键盘检测,检测到esc键退出
        if k == 27:
            break

    current_camera.release()  # 摄像头释放
    cv2.destroyAllWindows()  # 销毁所有窗口
    server_client.close()
    print("server end, exit!")
    exit()

if __name__ == '__main__':
    TestClient()


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值