为什么我的程序无法识别棋盘?
Why is my program not recognizing the Checkerboard?
我正在 运行使用 openCV 从 Python 中安装一个相机校准程序。我正在使用 XPS 15 9575 的计算机摄像头来捕捉我打印的经典黑白棋盘的不同帧。由于某种原因,它从不在程序中注册有棋盘。
我已经 运行 这个程序本身以及已经生成的图像并且它可以工作。它只是不起作用,因为我尝试捕获新的并立即处理它们。
这是代码的开头。它 运行 会检查它是否找到角点,然后进入下一步。当 运行ning 时,它永远不会超过这个。
cam = cv2.VideoCapture(0)
cv2.namedWindow("test")
img_counter = 0
imgNames = []
size = (5,5)
while True:
ret, frame = cam.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow("test", gray)
if not ret:
break
k = cv2.waitKey(1)
if k%256 == 27:
break
elif k%256 == 32:
img_name = "{}.png".format(img_counter)
imgtemp = cv2.imread(img_name)
graytemp = cv2.cvtColor(imgtemp,cv2.COLOR_BGR2GRAY)
ret, corners = cv2.findChessboardCorners(graytemp, size,None)
print (ret)
if ret == True:
print ("good!")
imgNames.append(img_name)
cv2.imwrite(img_name, frame)
img_counter += 1
else:
print ("again")
在您上面的代码中,您正在尝试读取实际上不存在的图像。看到这些行:
img_name = "{}.png".format(img_counter)
imgtemp = cv2.imread(img_name)
这里的img_name
只是一个字符串,还没有指向图片文件。你可以做一件事,捕获一帧并将其保存在这里并给它命名 img_name
然后尝试通过 cv2.imread
函数读取它,如下所示:
img_name = "{}.png".format(img_counter)
cv2.imwrite(img_name, frame)
imgtemp = cv2.imread(img_name)
或者,您可以将 imgtemp = cv2.imread(img_name)
替换为 imgtemp = frame
。在这种情况下,您不必保存然后处理帧。在这里,一旦按下 spacebar
,就会对当前捕获的视频帧进行处理而不保存它。
并且不要忘记在代码末尾添加以下行:
cam.release()
cv2.destroyAllWindows()
我正在 运行使用 openCV 从 Python 中安装一个相机校准程序。我正在使用 XPS 15 9575 的计算机摄像头来捕捉我打印的经典黑白棋盘的不同帧。由于某种原因,它从不在程序中注册有棋盘。
我已经 运行 这个程序本身以及已经生成的图像并且它可以工作。它只是不起作用,因为我尝试捕获新的并立即处理它们。
这是代码的开头。它 运行 会检查它是否找到角点,然后进入下一步。当 运行ning 时,它永远不会超过这个。
cam = cv2.VideoCapture(0)
cv2.namedWindow("test")
img_counter = 0
imgNames = []
size = (5,5)
while True:
ret, frame = cam.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow("test", gray)
if not ret:
break
k = cv2.waitKey(1)
if k%256 == 27:
break
elif k%256 == 32:
img_name = "{}.png".format(img_counter)
imgtemp = cv2.imread(img_name)
graytemp = cv2.cvtColor(imgtemp,cv2.COLOR_BGR2GRAY)
ret, corners = cv2.findChessboardCorners(graytemp, size,None)
print (ret)
if ret == True:
print ("good!")
imgNames.append(img_name)
cv2.imwrite(img_name, frame)
img_counter += 1
else:
print ("again")
在您上面的代码中,您正在尝试读取实际上不存在的图像。看到这些行:
img_name = "{}.png".format(img_counter)
imgtemp = cv2.imread(img_name)
这里的img_name
只是一个字符串,还没有指向图片文件。你可以做一件事,捕获一帧并将其保存在这里并给它命名 img_name
然后尝试通过 cv2.imread
函数读取它,如下所示:
img_name = "{}.png".format(img_counter)
cv2.imwrite(img_name, frame)
imgtemp = cv2.imread(img_name)
或者,您可以将 imgtemp = cv2.imread(img_name)
替换为 imgtemp = frame
。在这种情况下,您不必保存然后处理帧。在这里,一旦按下 spacebar
,就会对当前捕获的视频帧进行处理而不保存它。
并且不要忘记在代码末尾添加以下行:
cam.release()
cv2.destroyAllWindows()