私は、正面から透明なボックスを持っています。前面の透明パネルにカメラを配置して、内部の画像をキャプチャします。ほとんどの時間はボックスが空ですが、誰かがこのボックスの中にオブジェクトを置いたとしたら、キャプチャされた画像からこのオブジェクトを抽出するだけです。オブジェクトを持つボックスの画像からオブジェクトを抽出する
(私の本当の目的は、ボックス内に配置されたオブジェクトを認識することですが、最初にオブジェクトを抽出してトレーニングモデルを生成するためのフィーチャを抽出します。 )
私はOpenCVを初めて使っていて、Pythonでそれを使用しています。私はいくつかのOpenCV関数を見つけてくれました。
- GrabCutが、これは私が、ちょうど オブジェクトを抽出することができるよ、私はオブジェクトの上に長方形をマークすることを提供し、私のために完璧に動作しますが、 オブジェクトとしてのため、そのことはできませんボックス内の任意の場所することができオブジェクトの正確なサイズの矩形 を描画し、方法がある場合は私にお勧めします。
- 画像の違いは空のキャビティーボックスの画像があり、 オブジェクトが存在すると、画像間で の違いを計算するのにcv2.absdiff関数を使うことができますが、ほとんどが正しく動作しません。 場合によっては、ピクセルごとの差分計算を使用するので、 はこの結果が奇妙であり、光条件の変更もプラス は困難になります。
- バックグラウンドの減算、私はこれにいくつかの記事を読んで、これは 私は必要なものだと思われるが、私はビデオのためのものだと私はしなかった それはちょうど2つの画像空のボックスとオブジェクトの別のボックス。
は、背景差分のためのコードであっても、それは誰もがこのトピックに助けてくださいすることができ、短い距離
cap = cv2.VideoCapture(0)
fgbg = cv2.createBackgroundSubtractorMOG2()
fgbg2 = cv2.createBackgroundSubtractorKNN()
while True:
ret, frame = cap.read()
cv2.namedWindow('Real', cv2.WINDOW_NORMAL)
cv2.namedWindow('MOG2', cv2.WINDOW_NORMAL)
cv2.namedWindow('KNN', cv2.WINDOW_NORMAL)
cv2.namedWindow('MOG2_ERODE', cv2.WINDOW_NORMAL)
cv2.namedWindow('KNN_ERODE', cv2.WINDOW_NORMAL)
cv2.imshow('Real', frame)
fgmask = fgbg.apply(frame)
fgmask2 = fgbg2.apply(frame)
kernel = np.ones((3,3), np.uint8)
fgmask_erode = cv2.erode(fgmask,kernel,iterations = 1)
fgmask2_erode = cv2.erode(fgmask2,kernel,iterations = 1)
cv2.imshow('MOG2',fgmask)
cv2.imshow('KNN',fgmask2)
cv2.imshow('MOG2_ERODE',fgmask_erode)
cv2.imshow('KNN_ERODE',fgmask2_erode)
k = cv2.waitKey(30) & 0xff
if k == 27:
break
cap.release()
cv2.destroyAllWindows()
のためにそれほど正しく動作しない、また、上記の変更方法を、以下の通りであります私は空の画像を取得しようとすると、2つの画像を使用するコード。おかげで、事前にカメラから
サンプル画像は以下の通りです: (私は画像サイズが大きい理由です8MPカメラを使用しています、私はサイズを縮小して、ここでそれをアップロードする)
GrabCutのパフォーマンスを向上させるには、エッジ検出を実行してボックスのエッジを取得します。あなたが長方形にぴったり合ってGrabCutを実行することができたら、 –
イメージを提供していない場合、どのように人々がイメージ処理タスクを手伝うことを期待していますか? – m3h0w
@JeruLuke:ありがとう、私はいくつかのサンプル画像を更新し、あなたが示唆しているものを試してみます。 –