基于OpenCV获得图像中物体坐标

1. 目的

  1. 判断图像中哪些物体处于同一个水平面上,通过鼠标点击获得图片中各个物体的坐标。
  2. 初步了解OpenCV、回调函数、进程的阻塞与挂起。
    如下图所示,判断哪些神经元处于同一个水平切面上,图片来源于https://wormatlas.org/cellIDhead1.html
    T

2. 原理

2.1 OpenCV介绍

OpenCV中文官方文档:https://www.woshicver.com/
OpenCV是计算机视觉中经典的专用库,其支持多语言、跨平台,功能强大。

参考:https://segmentfault.com/a/1190000044071469
OpenCV的应用领域

  • 人脸识别和物体识别:这是OpenCV的一项重要功能,应用在许多领域,如安全监控、交互设计等。
  • 图像和视频分析:如图像增强、图像分割、视频跟踪等。
  • 图像合成和3D重建:在图像处理和计算机视觉领域,OpenCV可以用于创建AR或VR效果,生成3D模型等。
  • 机器学习:OpenCV内置了大量的机器学习算法,可以用于图像分类、聚类等任务。
  • 深度学习:OpenCV中的dnn模块提供了一系列深度学习模型的接口,用户可以加载预训练模型进行图像识别、目标检测等任务。

2.2 回调函数

回调函数是指一个函数被作为参数传递给另一个函数,并在另一个函数执行到某个特定点时被调用。

2.3 进程阻塞与挂起的区别

阻塞操作

  • I/O 操作: 例如读取文件、网络连接、等待用户输入等。这些操作需要等待外部资源,进程会阻塞直到资源可用。
  • 同步锁: 当多个线程需要访问共享资源时,使用同步锁来保证数据一致性。当一个线程获取了锁,其他线程就会被阻塞,直到该线程释放锁。
  • 信号量: 类似于同步锁,信号量用于控制对有限资源的访问。当信号量计数为 0 时,线程会被阻塞,直到其他线程释放资源。
  • 等待事件: 线程可以等待某个事件发生,例如某个条件满足或其他线程发出信号。在等待期间,线程会被阻塞。

挂起操作

  • 进程/线程切换: 操作系统会根据调度策略,将当前运行的进程或线程挂起,并切换到其他进程或线程。
  • 睡眠: 进程或线程可以调用 sleep() 函数进入休眠状态,等待指定时间后自动唤醒。
  • 等待唤醒: 进程或线程可以等待某个信号或事件,例如收到消息或被其他进程唤醒。

一些说明:

  • 阻塞操作通常是由于等待外部资源或事件而导致的,进程处于等待状态,无法执行其他操作。
    (当一个进程被阻塞时,它处于等待状态,不会执行任何代码,因此也不会占用 CPU 时间。操作系统会将 CPU 时间分配给其他可执行的进程。)
  • 挂起操作通常是操作系统或程序本身主动进行的,进程处于暂停状态,但可以被唤醒继续执行。
    (挂起意味着进程被暂停,它不再占用 CPU 时间,也不执行任何代码。操作系统会将该进程的资源(如内存、文件句柄等)保存起来,并将 CPU 时间分配给其他进程。)

区别总结:
在这里插入图片描述

3. 编程逻辑

1. 绑定鼠标事件:

# 定义鼠标点击事件处理函数
def click_event(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDOWN:
        print(f"点击位置的坐标: ({x}, {y})")

click_event函数注册为窗口 “Image” 的鼠标事件回调函数。

cv2.setMouseCallback("Image", click_event) # 将 click_event 函数绑定到窗口。

当用户在窗口 “Image” 上点击鼠标时,OpenCV 会自动调用click_event函数,并将点击事件相关的参数(如点击位置的坐标、鼠标按钮状态等)传递给click_event 函数。

2. 等待用户输入

cv2.waitKey(0) # 无限期地等待按键按下。

将进程阻塞,在 OpenCV 程序中等待用户输入,例如等待用户按下某个键来关闭窗口或进行其他操作。

4. 代码

import cv2

def get_coordinates(image_path):
    """
    读取图片,建立坐标系,点击图片中的任意位置,返回该位置的xy坐标。

    Args:
        image_path (str): 图片路径

    Returns:
        tuple: 点击位置的xy坐标,例如 (x, y)
    """
    # 读取图片
    img = cv2.imread(image_path)

    # 调整图片尺寸
    img = cv2.resize(img, (2480, 500))  # 将图片缩放到2480x500像素

    # 定义鼠标点击事件处理函数
    def click_event(event, x, y, flags, param):
        if event == cv2.EVENT_LBUTTONDOWN:
            print(f"点击位置的坐标: ({x}, {y})")

    # 创建窗口并绑定鼠标点击事件
    cv2.imshow("Image", img)
    cv2.setMouseCallback("Image", click_event)
    cv2.resizeWindow("Image", 2480, 500)  # 调整窗口尺寸

    # 等待用户点击
    cv2.waitKey(0)

    # 关闭窗口
    cv2.destroyAllWindows()

# 示例用法
image_path = "L.png"  # 替换为你的图片路径
get_coordinates(image_path)

5. 参考

  1. https://wormatlas.org/cellIDhead1.html
  2. https://www.woshicver.com/
  3. https://segmentfault.com/a/1190000044071469
  • 23
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值