这是一个简单的程序,它使用 OpenCV(在 Python 中)导入图像,将其转换为灰度并显示在窗口中。然后,当用户单击窗口中的某个位置时,将从该点执行填充。此外,当用户单击该点时,程序应在该位置打印原始 2D 像素值。
不幸的是,当太靠右时,OpenCV 会给我一个超出范围的错误,尽管它适用于图像的大部分部分。泛光填充本身在图像中的所有 xy 位置都正常工作。
在工作区域中,输出如下所示:
mouse at: 70 , 84
Image Size (220, 186)
cv2: (183.0, 0.0, 0.0, 0.0)
pil im: 255
但是当我向右走得太远时,输出看起来像这样:
mouse at: 198 , 129
Image Size (220, 186)
OpenCV Error: One of arguments' values is out of range (index is out of range) in cvGet2D
print "cv2: " + str(cv2.cv.Get2D(cv2.cv.fromarray(gray), x, y));
cv2.error: index is out of range
我尝试将图像转换为 PIL 图像并使用 Image.getpixel((x,y)) 函数,从某种意义上说它没有给我一个超出范围的异常,但不幸的是它完全返回 255 xy点(事实并非如此)。
我尝试将 OpenCV 函数调用中 xy 参数的位置 str(cv2.cv.Get2D(cv2.cv.fromarray(gray), x, y)) 切换为 str(cv2.cv.Get2D(cv2.cv.fromarray (gray), y, x)),这消除了超出范围的错误,但在所有位置都会导致 (255.0, 0.0, 0.0, 0.0) 的虚假返回。事实上,这个误差的临界点,在 x 维度上 >186,恰好是 y 维度的长度。这是一个主要线索,但不能解决问题(如上所示,我的测试图像尺寸为 220 x 186)。
import cv2
import cv
import PIL.Image
import numpy
def main():
#mouse event handler flag
CV_EVENT_LBUTTONDOWN = 1;
#THE CODE AT ISSUE IS CONTAINED IN THIS MOUSEHANDLE FUNCTION
def mouseHandle(event, x, y, flag, param):
if (flag == 1):
print "mouse is at: " + str(x) + " , " + str(y);
pilim = Image.fromstring("L", cv.GetSize(cv2.cv.fromarray(gray)),cv2.cv.fromarray(gray).tostring())
print "Image Size " + str(cv.GetSize(cv.fromarray(gray)))
print "cv2: " + str(cv2.cv.Get2D(cv2.cv.fromarray(gray), x, y));
print "pil im: " + str(pilim.getpixel((x,y)))
cv2.floodFill(gray,mask,(x,y), (255,255,0),diff,diff)
cv2.imshow('flood fill',gray)
#THE CODE BELOW IS BASIC OPENCV STUFF TO LOAD THE IMAGE AND INITIATE MOUSECALLS
#reads in the image
im = cv2.imread('image.jpg')
#converts it to grayscale
gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
cv2.imshow('grayscale', gray)
cv2.waitKey(0);
# flood fill variables
diff = (6,6,6)
mask = zeros((h+2,w+2),uint8)
# show the result in an OpenCV window, calling setMouseCallBack on mouse click
cv2.imshow('flood fill',gray)
cv2.setMouseCallback('flood fill', mouseHandle, CV_EVENT_LBUTTONDOWN)
cv2.waitKey(0)