2022年 11月 16日

Python:图像标注工具

  1. 作用:在图像上左键点击,显示红点,并记录点的像素坐标;右键时保存带点的图像并把点击的坐标和坐标总数写入.npy文件。
  2. 目录./imgs存放图像,./outputs存放标注结果。
  3. 类IMG作为传给鼠标回调函数的参数,它的成员data代表图像,name代表标注结果的路径,click_count代表一幅图像上的点数,points代表一幅图像上点的坐标。
  1. #encoding=utf-8
  2. import cv2 as cv
  3. import os
  4. import numpy as np
  5. class IMG:
  6. data = None
  7. name = None
  8. click_count = 0
  9. points = []
  10. def mouse_event(event, x, y, flags, item):
  11. if event == cv.EVENT_LBUTTONDOWN:
  12. cv.circle(item.data, (x, y), 3, (0, 0, 255), 2)
  13. item.click_count += 1
  14. item.points.append((x, y))
  15. cv.imshow(item.name.split('/')[1], item.data)
  16. cv.waitKey(0)
  17. elif event == cv.EVENT_RBUTTONDOWN:
  18. cv.imwrite(item.name + ".jpg", item.data)
  19. item.points.append(item.click_count)
  20. np.save(item.name + '_points_' + str(item.click_count) + '.npy', item.points)
  21. cv.destroyWindow(item.name.split('/')[1])
  22. if __name__ == '__main__':
  23. imgs_dir = 'imgs/'
  24. output_dir = 'outputs/'
  25. if not os.path.exists(output_dir):
  26. os.mkdir(output_dir)
  27. img_names = os.listdir(imgs_dir)
  28. for img_name in img_names:
  29. img = cv.imread(imgs_dir + img_name)
  30. item = IMG()
  31. item.points = []
  32. item.data = img
  33. item.name = output_dir + img_name.split('.')[0]
  34. cv.namedWindow(img_name.split('.')[0])
  35. cv.setMouseCallback(img_name.split('.')[0], mouse_event, item)
  36. cv.imshow(img_name.split('.')[0], img)
  37. cv.waitKey(0)