我遇到的问题是cv2方法如cv2.detectAndCompute,cv2.HoughlinesP在输入二进制图像时出现深度错误或NoneType失败。 对于例如在下面的
中def high_blue(B, G):
if (B > 70 and abs(B-G) <= 15):
return 255
else:
return 0
img = cv2.imread(os.path.join(dirPath,filename))
b1 = img[:,:,0] # Gives **Blue**
b2 = img[:,:,1] # Gives Green
b3 = img[:,:,2] # Gives **Red**
zlRhmn_query = np.zeros((2400, 2400), dtype=np.uint8)
zlRhmn_query[300:2100, 300:2100] = 255
zlRhmn_query[325:2075, 325:2075] = 0
cv2.imwrite('zlRhmn_query.jpg',zlRhmn_query)
zl_Rahmen_bin = np.zeros((img.shape[0], img.shape[1]), dtype=np.uint8)
zl_Rahmen_bin = np.vectorize(high_blue)
zl_Rahmen_bin = zl_Rahmen_bin(b1, b2)
cv2.imwrite('zl_Rahmen_bin.jpg',zl_Rahmen_bin)
sift = cv2.xfeatures2d.SIFT_create()
kp_query, des_query = sift.detectAndCompute(zlRhmn_query,None)
kp_train, des_train = sift.detectAndCompute(zl_Rahmen_bin,None)
只有zl_Rahmen_bin的最后一行失败并出现深度不匹配错误。奇怪的是,zlRhmn_query不会抛出任何错误。
接下来,当我使用此处给出的骨架化片段[http://opencvpython.blogspot.de/2012/05/skeletonization-using-opencv-python.html]并将骨架传递给HoughLinesP时,我得到一个NoneType类型的线对象。在检查时,我注意到骨架数组也是二进制的,即0或255。
请告知。
答案 0 :(得分:1)
我的生活中编写了50行Python,如果我在这里错了,请原谅我。
zl_Rahmen_bin = np.zeros((img.shape[0], img.shape[1]), dtype=np.uint8)
你刚刚创建了一个用零填充的二维数组。
zl_Rahmen_bin = np.vectorize(high_blue)
现在你立即将另一个值(一个函数)分配给同一个变量,这使得第一行非常陈旧。
zl_Rahmen_bin = zl_Rahmen_bin(b1, b2)
据我所知,您只需调用函数z1_Rahmen_bin并提供蓝色和绿色图像作为输入。输出应该是另一个2d数组,值为0或255。
我想知道np.vectorize如何知道输出应该是哪种数据类型。因为你显然需要uint8。 documentation表示如果没有给出类型,则通过使用第一个参数调用函数来确定。所以我猜这个例子中的默认类型是255或0。
和z1_Rahmen_bin.dtype实际上是np.uint32。
所以我修改了这个:
zl_Rahmen_bin = np.vectorize(high_blue)
要
zl_Rahmen_bin = np.vectorize(high_blue, otypes=[np.uint8])
似乎可以胜任这项工作。
仅仅做
就足够了z1_Rahmen_bin.dtype = np.uint8
但正如我所说,我不知道Python ......