Python OpenCV:检测黑暗背景中的方块
目前我正在尝试计算运动物体的光流。尤其是圆形旋钮周围的正方形: 以下是我试图处理的普通图像: 我关心的是最底部的右边的条带。当我尝试Canny边缘检测或GoodFeaturesToTrack时,这两个方块通常无法被检测到。我目前正在尝试一个锐化内核和一个阈值,然后通过形态学变换来寻找轮廓区域。但是,当我设置阈值时,我得到以下结果:Python OpenCV:检测黑暗背景中的方块,python,opencv,detection,Python,Opencv,Detection,目前我正在尝试计算运动物体的光流。尤其是圆形旋钮周围的正方形: 以下是我试图处理的普通图像: 我关心的是最底部的右边的条带。当我尝试Canny边缘检测或GoodFeaturesToTrack时,这两个方块通常无法被检测到。我目前正在尝试一个锐化内核和一个阈值,然后通过形态学变换来寻找轮廓区域。但是,当我设置阈值时,我得到以下结果: import numpy as np import cv2 as cv from matplotlib import pyplot as plt filenam
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
filename = 'images/Test21_1.tif'
image = cv.imread(filename)
kernel = [ [0, -1, 0], [-1, 5, -1], [0, -1, 0] ] #sharpen kernel I got from wikipedia
kernel = np.array(kernel)
dst = cv.filter2D(image, -1, kernel)
ret, thresh = cv.threshold(dst, 80, 150, cv.THRESH_BINARY_INV)
plt.subplot(121),plt.imshow(image),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(thresh),plt.title('Threshold')
plt.xticks([]), plt.yticks([])
plt.show()
我想知道我能在openCV中做些什么来识别那个正方形。这些方块是视频中移动的物体,我想用它们来计算光流。我目前正在考虑求助于PyTorch CNN来检测这些特征。我会为训练/测试数据集手动标记图像,但我认为这可能有点过头了。谢谢您的时间。问题是右下角正方形附近的局部对比度不好。您可以尝试使用CLAHE(对比度限制自适应直方图均衡化)吗
然后尝试使用您的算法来检测正方形。我不确定这是否更好,但您可以尝试使用Python/OpenCV中的除法规范化技术
- 读取输入
- 转换为灰度
- 应用形态学
- 将输入除以形态学的结果
- 自适应阈值
- 保存结果
分区图像: 阈值图像:
你不能直接计算密集光流,而不首先尝试找到正方形吗?如果正方形是唯一移动的对象,你也可以应用背景减法。你们能给我发送如何获得密集光流和背景减法的链接吗?我认为光流通常会用到某些点。谢谢
# improving local contrast
GRID_SIZE = 20
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(GRID_SIZE,GRID_SIZE))
image = clahe.apply(image)
import cv2
import numpy as np
# read the image
img = cv2.imread('rods.png')
# convert to gray
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# apply morphology
kernel = cv2.getStructuringElement(cv2.MORPH_RECT , (5,5))
smooth = cv2.morphologyEx(gray, cv2.MORPH_DILATE, kernel)
# divide gray by morphology image
division = cv2.divide(gray, smooth, scale=255)
# threshold
thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 7, 4)
# save results
cv2.imwrite('rods.division.jpg',division)
cv2.imwrite('rods.thresh.jpg',thresh)
# show results
cv2.imshow('smooth', smooth)
cv2.imshow('division', division)
cv2.imshow('thresh', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()