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 つのタプルのリストで分割しています。最初の 4 つは次のとおりです。

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

四角形はこの順序で取得され、3 番目の 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 に答える