【发布时间】:2019-12-17 22:38:24
【问题描述】:
我正在尝试为墨迹上的角找到准确的位置,如下所示:
我的想法是将线条拟合到边缘,然后找到它们相交的位置。到目前为止,我已经尝试使用具有各种 epsilon 值的 cv2.approxPolyDP() 来逼近边缘,但这看起来不像要走的路。我的 cv.approxPolyDP 代码给出以下结果:
理想情况下,这就是我想要制作的(绘制在油漆上):
是否有针对此类问题的 CV 函数?我考虑过在阈值步骤之前使用高斯模糊,尽管该方法似乎对于角点查找不太准确。此外,我希望它对旋转图像具有鲁棒性,因此在没有其他考虑的情况下,对垂直和水平线的过滤不一定会起作用。
代码*:
import numpy as np
from PIL import ImageGrab
import cv2
def process_image4(original_image): # Douglas-peucker approximation
# Convert to black and white threshold map
gray = cv2.cvtColor(original_image, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (5, 5), 0)
(thresh, bw) = cv2.threshold(gray, 128, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# Convert bw image back to colored so that red, green and blue contour lines are visible, draw contours
modified_image = cv2.cvtColor(bw, cv2.COLOR_GRAY2BGR)
contours, hierarchy = cv2.findContours(bw, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(modified_image, contours, -1, (255, 0, 0), 3)
# Contour approximation
try: # Just to be sure it doesn't crash while testing!
for cnt in contours:
epsilon = 0.005 * cv2.arcLength(cnt, True)
approx = cv2.approxPolyDP(cnt, epsilon, True)
# cv2.drawContours(modified_image, [approx], -1, (0, 0, 255), 3)
except:
pass
return modified_image
def screen_record():
while(True):
screen = np.array(ImageGrab.grab(bbox=(100, 240, 750, 600)))
image = process_image4(screen)
cv2.imshow('window', image)
if cv2.waitKey(25) & 0xFF == ord('q'):
cv2.destroyAllWindows()
break
screen_record()
- 关于我的代码的注释:我正在使用屏幕截图,以便可以实时处理这些图像。我有一台可以在屏幕上显示实时画面的数码显微镜,因此持续的屏幕录制可以让我从视频画面中采样并在屏幕的另一半上实时定位角落。
【问题讨论】:
-
如何获得两个适合您所在区域内外的矩形,然后取它们的“平均值”?
-
如果您还需要处理有角度的矩形,请考虑添加另一个带有该案例的示例图像。
-
谢谢 - 我添加了旋转样本的图像
-
墨迹是否总是矩形?如果不是,斑点上可能有多少个角?
-
在给出任何明智的答案之前,您需要告诉我们拐角的确切位置。因为这是主观的。
标签: python image opencv image-processing computer-vision