Files
micro_servers/lci/src/mainCameraClient.py
T
2026-08-02 20:15:07 +08:00

78 lines
2.1 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
相机客户端Python实现
功能:连接服务器接收YUYV格式视频流,转换为RGB并显示
"""
import socket
import cv2
import numpy as np
import sys
def main():
if len(sys.argv) != 3:
print(f"Usage: {sys.argv[0]} <server_ip> <port>")
return 1
server_ip = sys.argv[1]
port = int(sys.argv[2])
# 创建TCP套接字
sockfd = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
# 连接到服务器
sockfd.connect((server_ip, port))
print(f"Connected to server: {server_ip}:{port}")
# 图像参数
WIDTH = 640
HEIGHT = 480
FRAME_BUFFER_SIZE = WIDTH * HEIGHT * 2 # YUYV格式:640x480,每个像素2字节
# OpenCV窗口
cv2.namedWindow("Camera Stream", cv2.WINDOW_AUTOSIZE)
frame_count = 0
while True:
# 接收帧数据
frame_buffer = b''
while len(frame_buffer) < FRAME_BUFFER_SIZE:
data = sockfd.recv(FRAME_BUFFER_SIZE - len(frame_buffer))
if not data:
print("Server closed connection")
return 0
frame_buffer += data
print(f"Frame {frame_count + 1} received: {len(frame_buffer)} bytes")
frame_count += 1
# 使用OpenCV处理YUYV帧
yuyv_frame = np.frombuffer(frame_buffer, dtype=np.uint8).reshape((HEIGHT, WIDTH, 2))
rgb_frame = cv2.cvtColor(yuyv_frame, cv2.COLOR_YUV2BGR_YUYV)
# 显示帧
cv2.imshow("Camera Stream", rgb_frame)
# 等待1ms,允许窗口刷新,同时检查是否按下ESC键退出
if cv2.waitKey(1) == 27:
print("ESC key pressed, exiting...")
break
except Exception as e:
print(f"Error: {e}")
return 1
finally:
# 清理资源
sockfd.close()
cv2.destroyAllWindows()
print("Client exiting")
return 0
if __name__ == "__main__":
sys.exit(main())