1

私のシステムは Linux HPDebian 3.2.0-2-amd64 #1 SMP x86_64 GNU/Linux Python 2.7、OpenCV2 です。使用できるカムは 1 つだけです。

私の質問は、2 つのカムからビデオ フィードを取得する方法ですか? 私は C++ 版を読んでいましたが、私は Python の方が好きです。非プログラマーにとっては簡単です。

私のウェブカメラが Wleft しか動かない理由がわかりませんが、Wright は空白の灰色のウィンドウです。そしてコマンドラインで

VIDIOC_QBUF: 引数が無効です

コマンドラインをフラッディングし続けます。

OpenCV-Python には既製のステレオ プログラムのパッケージがありますが、アルゴリズムをテストしたいので、各カムの要素にアクセスする必要があります。

私の試み:

'''
Simple Stereo feed
'''
import cv
cv.NamedWindow("wLeft", cv.CV_WINDOW_AUTOSIZE)
cv.NamedWindow("wRight", cv.CV_WINDOW_AUTOSIZE)
captureL = cv.CaptureFromCAM(0)
captureR = cv.CaptureFromCAM(1)

def repeat():
    frameL = cv.QueryFrame(captureL)
    cv.ShowImage("wLeft", frameL)
    frameR = cv.QueryFrame(captureR)
    cv.ShowImage("wRight", frameR)

while True:
    repeat()
    if cv.WaitKey(33)==27:
       break

cv.DestroyAllWindows()

更新 1

質問への回答:

  1. 現在の OpenCV-Python では。コマンドが見つかりませんが、Leftcam をコメントアウトすると、Rightcam が機能します。およびその逆。

  2. はい、私はちょうどそれを見つけました!. コマンドをリダイレクトし、慎重に検索しました。

    libv4l2: ストリームをオンにする際のエラー: デバイスにスペースが残っていません

  3. それらは同一です。OKER193.

  4. 左または右のみの1つのカムのみを使用できます。同時に 2 つのビデオ フィードを取得できません。

  5. 私にはハブがありません。実際のポートかどうかはわかりませんが、ノートの左右に接続しています。

    http://opencv-users.1802565.n2.nabble.com/Multiple-Camera-Read-Error-td7001563.html

cv.ReleaseCapture() を試しました

def repeat():
        frameL = cv.QueryFrame(captureL)
        cv.ShowImage("wLeft", frameL)
        cv.ReleaseCapture(captureL)
        frameR = cv.QueryFrame(captureR)
        cv.ShowImage("wRight", frameR)
        cv.ReleaseCapture(captureR)

エラーが発生しました:

...
VIDIOC_QUERYMENU: Invalid argument //Many lines
...
Traceback (most recent call last):
  File "55.py", line 19, in <module>
    repeat()
  File "55.py", line 13, in repeat
    cv.ReleaseCapture(captureL)
AttributeError: 'module' object has no attribute 'ReleaseCapture'


http://opencv.willowgarage.com/documentation/python/highgui_reading_and_writing_images_and_video.html?highlight=releasecapture CaptureFromCAM
最終行 say 構造を解放するには、ReleaseCapture を使用します。この機能はドロップアウトされる可能性があります。

さまよって、これを見つけました
https://superuser.com/questions/431759/using-multiple-usb-webcams-in-linux

次に、カムごとの解像度が通常どおり 640x480 であることを確認します。私のウェブカメラは 1.1/2.0 USB インターフェイスです。

root@HPDebian:~# v4l2-ctl -d /dev/video0 --list-formats
ioctl: VIDIOC_ENUM_FMT
    Index       : 0
    Type        : Video Capture
    Pixel Format: 'YUYV'
    Name        : YUV 4:2:2 (YUYV)

次に、別のカムをチェックします

root@HPDebian:~# v4l2-ctl -d /dev/video1 --list-formats
ioctl: VIDIOC_ENUM_FMT
    Index       : 0
    Type        : Video Capture
    Pixel Format: 'YUYV'
    Name        : YUV 4:2:2 (YUYV)

この時点で、自分の USB ノートブックについてよくわかりません。中のハブかもしれません。解像度を下げて、結果を再度投稿します。

更新 2

Martin の time.sleep(1) を試してください:

VIDIOC_QUERYMENU: Invalid argument //Many lines
libv4l2: error setting pixformat: Device or resource busy
HIGHGUI ERROR: libv4l unable to ioctl S_FMT
libv4l2: error setting pixformat: Device or resource busy
libv4l1: error setting pixformat: Device or resource busy
HIGHGUI ERROR: libv4l unable to ioctl VIDIOCSPICT

libv4l2: error turning on stream: No space left on device
VIDIOC_STREAMON: No space left on device
VIDIOC_QBUF: Invalid argument  //Many lines until Ctrl C

M$ xp でもう一度試してみます。

アップデート 3

まだLinuxを使用しています。M$ xp はビジーです。今回は c1 と c2 を削除します。カメラの解除方法がわからないので。私が使用しているドライバーの API は、一度に 1 つのデバイス アクセス カーネルのみを許可していると思います。だから私はこれを試します。

def repeat1():
    c1 = cv.CreateCameraCapture(0)
    i1 = cv.QueryFrame(c1)
    cv.ShowImage("WebCAM1", i1)
    del(c1)
def repeat2():
    c2 = cv.CreateCameraCapture(1)
    i2 = cv.QueryFrame(c2)
    cv.ShowImage("WebCAM2", i2)    
    del(c2)

プログラムの実行が非常に遅く、WebCAM1 は歪んでいますが、WebCAM2 は歪んでいません。

4

2 に答える 2

0

確認すべき点:

  1. OpenCVはすべてのカメラをピックアップしていますか?取り付けられているカメラの数を確認してみてください。
  2. 他のエラーメッセージでエラーが発生しますか?つまり、あなたが言及したものとのスタックトラックはありますか?
  3. 2台のカメラの間にハードウェアの違いはありますか?
  4. lcamに関するすべてのことをコメントアウトするとどうなりますか?つまり、2台目のカメラに関係するのか、それとも2台のカメラを同時に実行するのに関係するのか。
  5. この提案に従って、それらを別々のハブに接続してみてください
于 2012-06-20T12:13:29.473 に答える