1

我使用以下代码使用我的网络摄像头拍摄了一张图像:

cv.NamedWindow("w1", cv.CV_WINDOW_AUTOSIZE)
capture = cv.CaptureFromCAM(0)
cv.SetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_WIDTH, 960)
cv.SetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_HEIGHT, 544)

def record():
    frame = cv.QueryFrame(capture)
    cv.ShowImage("w1", frame)
    splitter(frame, 4)

我正在尝试使用 cv.GetSubRect 将其裁剪成更小的部分:

def splitter(image, split):
    width, height = cv.GetSize(image)
    x = width/split
    y = height/split

    # Form the 4-tuples.
    img_parts = []
    for y_pos in range(split):
        for x_pos in range(split):
            xy_section = (x_pos*x, y_pos*y, (x_pos+1)*x, (y_pos+1)*y)
            # print xy_section
            img_parts.append(xy_section)

    # The cropping.
    cropped_parts = []
    for part in img_parts:
        # print "part "+str(part)
        cropped = cv.GetSubRect(image, part) # Error is thrown here
        cropped_parts.append(cropped)

但我不断收到错误消息

OpenCV 错误:cvGetSubRect 中输入数组 () 的大小不正确,文件 /build/buildd/opencv-2.3.1/modules/core/src/array.cpp,第 1262 行

捕获的图像大小为 960x544,我将其拆分为 4 元组列表,其中前四个是:

  • (0, 0, 240, 136)
  • (240, 0, 480, 136)
  • (480, 0, 720, 136)
  • (720, 0, 960, 136)

矩形按该顺序获取,当尝试获取第三个 4 元组 (480, 0, 720, 136) 的矩形时会引发错误。原始图像大于(960x544),所以出了什么问题?使用 image.crop() 在 Python 的 PIL 中使用了相同的方法,但 opencv 的替代方法似乎有点不同,我只是不知道怎么做?

4

1 回答 1

3

Opencv 的 .GetSubRect() 与 PIL 的 .crop() 有点不同。两者都将 4 元组作为参数,但它们以不同的方式描述要裁剪的区域。

PIL .crop():

(pos_left, pos_top, pos_right, pos_bottom)

例如,在 100x100 大小的图像(0、50、50、100)中,正好裁剪图像的左下角,从而生成 50x50 大小的图像。

Opencv .GetSubRect():

(pos_left, pos_top, width, height)

对于相同大小的 100x100 图像,(0, 50, 50, 100) 将从原始图像的位置 (0, 50) 开始裁剪 50x100 大小的区域。以这种方式超出原始图像大小并引发错误。要裁剪左下角, (0, 50, 50, 50) 有效。

于 2012-07-25T20:43:03.223 回答