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.html
- https://www.woshicver.com/
- https://segmentfault.com/a/1190000044071469