1. 目的

判断图像中哪些物体处于同一个水平面上,通过鼠标点击获得图片中各个物体的坐标。初步了解OpenCV、回调函数、进程的阻塞与挂起。

如下图所示,判断哪些神经元处于同一个水平切面上,图片来源于https://wormatlas.org/cellIDhead1.html

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. 参考

https://wormatlas.org/cellIDhead1.htmlhttps://www.woshicver.com/https://segmentfault.com/a/1190000044071469