使用OpenCV计算滑块缺口

1.参考文章:https://blog.csdn.net/qq_27371025/article/details/133072065
2.实现过程:接口中传入base64 图片,base64转化为image ,通过图片获取缺口信息
实现步骤:
2.1 安装:cv2
opencv-python 是 OpenCV(Open Source Computer Vision Library)的 Python 绑定。OpenCV 是一个开源的计算机视觉和机器学习库,包含了大量的图像处理函数和计算机视觉算法。通过 opencv-python,Python 开发者能够方便地使用这些功能和算法来处理图像和视频数据。

pip install opencv-python
pip install opencv-contrib-python
def show(name):
    '''展示圈出来的位置'''
    cv2.imshow('Show', name)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

def _tran_canny(image):
    """消除噪声"""
    image = cv2.GaussianBlur(image, (3, 3), 0)
    return cv2.Canny(image, 50, 150)


def detect_displacement(img_slider_path, image_background_path):
    """detect displacement"""
    # # 参数0是灰度模式
    image = cv2.imread(img_slider_path, 0)
    template = cv2.imread(image_background_path, 0)

    # 寻找最佳匹配
    res = cv2.matchTemplate(_tran_canny(image), _tran_canny(template), cv2.TM_CCOEFF_NORMED)
    # 最小值,最大值,并得到最小值, 最大值的索引
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)

    top_left = min_loc[0]  # 横坐标
    # 展示圈出来的区域
    x, y = min_loc  # 获取x,y位置坐标
    w, h = image.shape[::-1]  # 宽高
    cv2.rectangle(template, (x, y), (x+w, y+h), (0, 0, 255), 2) #左上 右下 边框颜色,线条厚度
    # show(template)
    top_left = x+w
    return top_left

def base64_change_image(base64_str,type):
    # 移除base64字符串中的前缀(例如 'data:image/jpeg;base64,')
    base64_img_bytes = base64_str.split(',')[1]
    # 解码base64字符串为字节
    img_bytes = base64.b64decode(base64_img_bytes)
    # 将字节转换为numpy数组
    nparr = np.frombuffer(img_bytes, np.uint8)
    # 将numpy数组转换为OpenCV图像
    img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
    # 检查图像是否正确加载
    if img is None:
        print("Error: 图像未正确加载")
    else:
        if type == "left":
            cv2.imwrite('img/left.jpg', img)
            return "img/left.jpg"
        elif type == "back":
            cv2.imwrite('img/back.jpg', img)
            return "img/back.jpg"
        else:
            cv2.imwrite('img/icon.jpg', img)
            return "img/icon.jpg"


def get_click_points(image_path):
    # 读取图片
    image = cv2.imread(image_path)
    # 转换为灰度图
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    # 二值化处理
    _, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)
    # 查找轮廓
    contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    # 遍历轮廓,寻找点
    points = []
    for contour in contours:
        # 获取轮廓的边界框
        x, y, w, h = cv2.boundingRect(contour)
        # 可以根据实际情况过滤小轮廓
        if w > 5 and h > 5:
            # 标记轮廓
            cv2.rectangle(image, (x-10, y), (x + w-10, y + h), (0, 255, 0), 2)
            # 保存点击位置
            points.append((x + w // 2, y + h // 2))

    # 显示图片
    cv2.imshow('Image with points', image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    return points


@app.route('/SlidingBlock')
def sliding_block():
    start_now = datetime.now()
    start_now_time = start_now.strftime("%Y-%m-%d %H:%M:%S")
    print("开始时间:", start_now_time)
    date = request.get_json()
    left_image_str = date['left_image']
    left_image = base64_change_image(left_image_str, "left")
    back_image_str = date['back_image']
    back_image = base64_change_image(back_image_str, "back")
    skewing = detect_displacement(left_image, back_image)
    print(f"偏移:{skewing}")
    data = {'skewing': skewing}
    last_now = datetime.now()
    last_now_time = last_now.strftime("%Y-%m-%d %H:%M:%S")
    print("结束时间:", last_now_time)
    return jsonify(data)

相关推荐

  1. 使用OpenCV计算缺口

    2024-04-23 12:50:01       38 阅读
  2. 使用vue3+ts封装一个Slider组件

    2024-04-23 12:50:01       24 阅读
  3. MFC:控件与进度条控件的使用

    2024-04-23 12:50:01       39 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-23 12:50:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-23 12:50:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-23 12:50:01       87 阅读
  4. Python语言-面向对象

    2024-04-23 12:50:01       96 阅读

热门阅读

  1. .NET 高级开发人员面试常见问题及解答

    2024-04-23 12:50:01       39 阅读
  2. NLP预训练模型-GPT-3

    2024-04-23 12:50:01       35 阅读
  3. .NET WinForm开放中的 窗体的 Designer.cs作用

    2024-04-23 12:50:01       44 阅读
  4. Rx.Net 第四章

    2024-04-23 12:50:01       35 阅读
  5. [python] __setitem__与__getitem__的使用

    2024-04-23 12:50:01       181 阅读
  6. git 常用命令

    2024-04-23 12:50:01       57 阅读
  7. Elasticsearch与IK分词器:深度解析与实战应用

    2024-04-23 12:50:01       52 阅读
  8. python借助elasticsearch实现标签匹配计数

    2024-04-23 12:50:01       35 阅读
  9. 五道基础且高频的Python算法面试题

    2024-04-23 12:50:01       36 阅读
  10. .NET/C#汇总 —— 数据库概念知识

    2024-04-23 12:50:01       36 阅读