opencv的cv.GetSubRect和PIL的.crop()之间有区别吗?

时间:2012-07-24 18:59:32

标签: python opencv

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

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的替代方法似乎有点不同,我只是想不通怎样?

1 个答案:

答案 0 :(得分:2)

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)可以正常工作。