【发布时间】:2019-05-29 21:25:33
【问题描述】:
我正在做这个大学项目,我尝试在使用 openCV 的 Android 应用程序的屏幕截图上检测 UI 元素。我并不期望这种 UI 元素的检测有 100% 的准确度。
这是我下面的代码。我将图像转换为灰度,应用高斯模糊,然后使用自适应阈值将图像转换为二进制。之后我使用查找轮廓方法。
ap = argparse.ArgumentParser()
ap.add_argument("-i","--image", help = "path to an image", required =
True)
args = vars(ap.parse_args())
image = cv2.imread(args["image"])
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow("gray",gray)
cv2.waitKey(0)
blurred = cv2.GaussianBlur(gray, (5,5), 0)
thresh = cv2.adaptiveThreshold(blurred, 255,
cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY_INV, 11, 4)
cv2.imshow("thresh",thresh)
cv2.waitKey(0)
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
cv2.drawContours(image, cnts, -1, (0,255,0), 1)
cv2.imshow("contours", image)
cv2.waitKey(0)
for c in cnts:
area = cv2.contourArea(c)
print(area)
if area > 50:
M = cv2.moments(c)
cX = int(M['m10'] / M['m00'])
cY = int(M['m01'] / M['m00'])
#cv2.drawContours(image, [c], -1, (0,255,0), 2) # draw contours on image
(x,y,w,h) = cv2.boundingRect(c) # for each contour get a
bounding rectangle
mask = np.zeros(image.shape[:2], dtype = "uint8") # find
shape of the image dimensions and set up a mask
mask[y: y + h, x: x + w] = 255 # convert region of
interest into white
to_display = cv2.bitwise_and(image,image, mask = mask) # carry
out bitwise and
#cv2.putText(image, 'center', (c))
cv2.imshow("Image", to_display)
cv2.waitKey(0)
这是我正在运行我的代码的屏幕截图。
最左边的屏幕截图表示应用阈值后的图像。
中间的图像代表我绘制轮廓后得到的图像。
当我检查每个单独的轮廓时,最后一张图像显示。轮廓覆盖线但不封装矩形。
我有几个问题。
1) 是否可以筛选出白色矩形的轮廓。我必须对我的代码进行哪些更改才能实现这一目标?
2) 我试图筛选出不重要的轮廓,例如。这些话,我在想我是否可以使用 getArea() 函数来帮助我。这个想法是我会设置一个最小轮廓大小来过滤掉占单词的较小轮廓。
这是我尝试在此屏幕截图中识别“对象”的另一张图片。
我在这里遇到了同样的问题,我无法识别白色矩形。我只是识别矩形的边界。
感谢任何形式的帮助,因为我还是 openCv 的新手
处理前的原图:
【问题讨论】:
-
能否提供处理前的应用图片?
-
@J.D 你好我已经添加了原始截图
标签: opencv object-detection opencv-contour