色块定位多场景切换

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))
    server_client.connect(("localhost", 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)

    zero_x = 320
    zero_y = 240

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

        if ready_to_read:
            data = server_client.recv(1024).decode()
            if data == '1':
                zero_x = 320
                zero_y = 240
            if data == '2':
                zero_x = 420
                zero_y = 340
            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]
        cv2.line(frame, (zero_x - 10, zero_y), (zero_x + 10, zero_y), (192, 192, 192), 2)
        cv2.line(frame, (zero_x, zero_y - 10), (zero_x, zero_y + 10), (192, 192, 192), 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 = zero_x - int(center_x)
            delta_y = zero_y - int(center_y)
            if data == '0':
                pass
            if data == '1':
                if (-30 <= delta_x <= 30) and (-30 <= delta_y <= 30):
                    server_client.send(
                        "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".encode('utf-8'))
                    print("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")
                else:
                    server_client.send(f"({delta_x},{delta_y})".encode('utf-8'))
                    print(f"({delta_x},{delta_y})")
            if data == '2':
                if (-30 <= delta_x <= 30) and (-30 <= delta_y <= 30):
                    server_client.send(
                        "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".encode('utf-8'))
                    print("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")
                else:
                    server_client.send(f"({delta_x},{delta_y})".encode('utf-8'))
                    print(f"({delta_x},{delta_y})")
            time.sleep(0)  # 等待秒数
        cv2.imshow('Frame', frame)
        k = cv2.waitKey(5) & 0xFF  # 键盘检测,检测到esc键退出
        if k == ord('s'):  # 按下s键,进入下面的保存图片操作
            cv2.imwrite("D:/gyw/" + str(index) + ".jpg", frame)
            print("save" + str(index) + ".jpg successfuly!")
            print("-------------------------")
            index += 1
        if k == 27:
            break

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


if __name__ == '__main__':
    TestClient()

### 回答1: 24色卡色块定位是指利用Python进行图像处理,通过颜色信息将24种不同颜色的卡片进行定位。下面是一个简单的实现过程: 首先,导入必要的库,如OpenCV和NumPy。然后,读取图像并转换为HSV色彩空间,这样可以更好地提取颜色信息。 接下来,定义一个包含24个色块的列表,每个色块代表一种颜色。对于每个色块,计算其在HSV色彩空间中的颜色范围。这可以通过调整色块周围的一些样本点得到,以确保能够捕获到该颜色的各种亮度和饱和度变化。 然后,使用OpenCV的inRange函数根据颜色范围创建一个掩码。将掩码与原始图像进行位与运算,剩下的就是颜色范围内的部分,即色块。 接下来,使用OpenCV的findContours函数找到色块的轮廓。可以通过设置适当的面积阈值来滤除一些噪声。 最后,对每个色块的轮廓进行适当的处理,如计算其中心、绘制边界框等,以便在图像中进行定位和识别。 当然,这只是一个简单的实现过程,实际应用中还可能涉及到其他问题,如光照变化、遮挡和噪声等,需要进行更多的处理和优化。 ### 回答2: 24色卡色块定位是指使用Python程序对一组包含24种不同颜色色块的图像进行定位和识别。 首先,我们可以使用Python中的各种图像处理库(如OpenCV)加载图像,并将其转换为灰度图像或者RGB图像。然后,我们可以使用色彩空间转换函数将图像转换为HSV色彩模式。 接下来的步骤是通过使用HSV图像和预定义的颜色范围来检测和提取24种不同颜色的色块。为此,我们可以设置每种颜色的HSV上下界,通过循环遍历每个像素进行检测。符合颜色范围的像素会被置为白色,其他的像素则被置为黑色。 在提取出每个颜色的色块之后,我们可以使用形态学操作(如腐蚀和膨胀)来去除噪点,并确保色块的完整性。然后,我们可以使用轮廓检测算法(如findContours函数)来找到每个色块的边界。 最后,我们可以使用几何形状和大小的特征来筛选和识别每个色块。例如,我们可以根据色块的面积、长宽比等特征来判断其颜色类型。 总的来说,使用Python编写的24色卡色块定位程序需要加载图像、转换色彩空间、通过颜色范围提取色块、进行形态学操作和轮廓检测、识别颜色块的特征等步骤。这个过程可以帮助我们在给定的图像中准确地定位和识别出24种不同颜色的色块。 ### 回答3: 24色卡色块定位是指通过Python代码来识别和定位一组包含24种颜色的色块。这个任务可以通过使用计算机视觉技术来实现。 首先,需要使用Python中的图像处理库(如OpenCV)来读取输入图像。然后,可以使用颜色检测算法来提取图像中的色块。 一种常用的颜色检测算法是基于阈值的方法。可以使用Hue-Saturation-Value (HSV) 颜色空间来处理图像。首先,将图像从RGB颜色空间转换为HSV颜色空间。然后,定义24种颜色的HSV值范围,比如使用Hue值、Saturation值和Value值的最小和最大阈值。接下来,通过在HSV图像中应用颜色阈值,可以得到二进制掩码图像,其中色块部分为白色,非色块部分为黑色。 接着,可以使用图像处理库中的形态学操作(如腐蚀和膨胀)来去除图像中的噪声,并进一步优化色块定位结果。形态学操作基于结构元素,可以通过腐蚀操作来缩小图像中的白色区域,通过膨胀操作来扩大图像中的白色区域。 最后,可以使用Python中的连通组件分析算法来识别和定位每个色块的位置。连通组件分析可以将相连的白色像素区域组合为一个连通组件,每个连通组件表示一个色块。可以通过计算每个连通组件的中心位置来确定每个色块的位置。 总结起来,通过使用Python中的图像处理和计算机视觉技术,可以实现24色卡色块定位,其中包括颜色检测、形态学操作和连通组件分析这些步骤。这个过程可以帮助我们在图像中准确地定位和识别24种颜色的色块
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值