如何使用opencv将两个鼠标坐标[(x0,y0),(x1,y1)]导出到python中的txt文件中



我目前正在编写一个对象检测程序。我最初的工作是读取鼠标坐标,并将它们导出到一个文本文件(用于进一步的过程(。

我尝试了来自另一个链接的一些代码(https://www.pyimagesearch.com/2015/03/09/capturing-mouse-click-events-with-python-and-opencv/)。它确实起了作用,但我不知道如何将这些类型的文件导出函数添加到原始代码中。任何帮助都将不胜感激!

当我在终端中运行一个命令,比如"python click_and_crop.py-image img_0001_c0.pgm"时,我希望得到一个内容为"355、53、424、107"的txt文件,这样将来我就可以调用这个函数,从更多的图片中获取更多的鼠标坐标。然而,我得到了"[[(299190(,(421285(]]"(没有"(。

# USAGE
# python click_and_crop.py --image img_0001_c0.pgm
# import the necessary packages
import argparse
import cv2
# initialize the list of reference points and boolean indicating
# whether cropping is being performed or not
refPt = []
cropping = False
str1 = []
path_name = 'mouseCoordinates.txt'
def click_and_crop(event, x, y, flags, param):
# grab references to the global variables
global refPt, cropping
# if the left mouse button was clicked, record the starting
# (x, y) coordinates and indicate that cropping is being
# performed
if event == cv2.EVENT_LBUTTONDOWN:
refPt = [(x, y)]
cropping = True
# check to see if the left mouse button was released
elif event == cv2.EVENT_LBUTTONUP:
# record the ending (x, y) coordinates and indicate that
# the cropping operation is finished
refPt.append((x, y))
cropping = False
# draw a rectangle around the region of interest
cv2.rectangle(image, refPt[0], refPt[1], (0, 255, 0), 2)
print(refPt[0][0], refPt[0][1], refPt[1][0], refPt[1][1])
str1.append(refPt)
cv2.imshow("image", image)
mouseXY = open(path_name, 'w')
mouseXY.write(str(str1))
mouseXY.close()

# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="Path to the image")
args = vars(ap.parse_args())
# load the image, clone it, and setup the mouse callback function
image = cv2.imread(args["image"])
clone = image.copy()
cv2.namedWindow("image")
cv2.setMouseCallback("image", click_and_crop)
# keep looping until the 'q' key is pressed
while True:
# display the image and wait for a keypress
cv2.imshow("image", image)
key = cv2.waitKey(1) & 0xFF
# if the 'r' key is pressed, reset the cropping region
if key == ord("r"):
image = clone.copy()
# if the 'c' key is pressed, break from the loop
elif key == ord("c"):
break
# if there are two reference points, then crop the region of interest
# from teh image and display it
if len(refPt) == 2:
roi = clone[refPt[0][1]:refPt[1][1], refPt[0][0]:refPt[1][0]]
cv2.imshow("ROI", roi)
cv2.waitKey(0)
# close all open windows
cv2.destroyAllWindows()
# USAGE
# python click_and_crop.py --image img_0001_c0.pgm
# import the necessary packages
import argparse
import cv2
# initialize the list of reference points and boolean indicating
# whether cropping is being performed or not
refPt = []
cropping = False
str1 = []
path_name = 'mouseCoordinates.txt'
def click_and_crop(event, x, y, flags, param):
# grab references to the global variables
global refPt, cropping
# if the left mouse button was clicked, record the starting
# (x, y) coordinates and indicate that cropping is being
# performed
if event == cv2.EVENT_LBUTTONDOWN:
refPt = [(x, y)]
cropping = True
# check to see if the left mouse button was released
elif event == cv2.EVENT_LBUTTONUP:
# record the ending (x, y) coordinates and indicate that
# the cropping operation is finished
refPt.append((x, y))
cropping = False
# draw a rectangle around the region of interest
cv2.rectangle(image, refPt[0], refPt[1], (0, 255, 0), 2)
print(refPt[0][0], refPt[0][1], refPt[1][0], refPt[1][1])
str1.append(refPt[0])
cv2.imshow("image", image)
mouseXY = open(path_name, 'w')
mouseXY.write()
mouseXY.close()

# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="Path to the image")
args = vars(ap.parse_args())
# load the image, clone it, and setup the mouse callback function
image = cv2.imread(args["image"])
clone = image.copy()
cv2.namedWindow("image")
cv2.setMouseCallback("image", click_and_crop)
# keep looping until the 'q' key is pressed
while True:
# display the image and wait for a keypress
cv2.imshow("image", image)
key = cv2.waitKey(1) & 0xFF
# if the 'r' key is pressed, reset the cropping region
if key == ord("r"):
image = clone.copy()
# if the 'c' key is pressed, break from the loop
elif key == ord("c"):
break
# if there are two reference points, then crop the region of interest
# from teh image and display it
if len(refPt) == 2:
roi = clone[refPt[0][1]:refPt[1][1], refPt[0][0]:refPt[1][0]]
cv2.imshow("ROI", roi)
cv2.waitKey(0)
# close all open windows
cv2.destroyAllWindows()

您可以编写类似这样的函数,将鼠标指针作为输入并附加到文件中。

def write_to_file(x, y, a, b):
'''
Writes the mouse coordinates to a text file
'''
# open the mouse coordinates
with open('mouseCoordinates.txt', 'a') as f:
# create a string ready to write to the file
coordinates = str(x) + ',' + str(y) + ',' + str(a) + ',' + str(b) + 'n'
# write to file
f.write(coordinates)

然后你会像这样输入坐标?

write_to_file(refPt[0][0], refPt[0][1], refPt[1][0], refPt[1][1])

最新更新