4

Ångström Linux 3.2.28を実行している BeagleBone があり、カメラからフレームをキャプチャしようとしています。

そこで、USB ウェブカメラを接続して、/dev表示されることを確認します。

video0(右下)のようにそうです。カメラのプラグを抜くと消えるので、これは正しいと思います。

(ボ

そこで、Python を起動して以下を実行します。

root@beaglebone:/dev# python
Python 2.7.2 (default, Sep 11 2012, 16:15:43)
[GCC 4.5.4 20120305 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv
>>> capture=cv.CaptureFromCAM(-1)
>>> img=cv.QueryFrame(capture)
>>> type(capture)
<type 'cv2.Capture'>
>>> type(img)
<type 'NoneType'>

ご覧のとおり、キャプチャ オブジェクトは十分に作成できていますが、そこからフレームを取得することはできません。-1また、カメラ ID (上記のコード) に異なる (またはなしの) 整数引数を使用してこれを試しましたが、役に立ちませんでした。

参考までに、ラップトップでIPythonを使用して同じコードを実行すると、次のようになります。

In [1]: import cv
In [2]: capture=cv.CaptureFromCAM(-1)
In [3]: img=cv.QueryFrame(capture)
In [4]: type(capture)
Out[4]: cv2.Capture
In [5]: type(img)
Out[5]: cv2.cv.iplimage

ここで実際に画像をキャプチャしていることがわかります。ここからどこへ行くべきか正確にはわかりません。

アップデート:

私はFFmpegで少し遊んで、次のコマンドを発行してカメラを応答させることができました(つまり、ライトが点灯します):

root@beaglebone:/# ffmpeg -f video4linux2 -i /dev/video0

どうやら CaptureFromCAMV4Lインターフェイスを使用しているので、これは興味深いです...ここからどこに行くべきかわかりません。

4

3 に答える 3

2

最初に行う必要があるのは、成功したこと を確認することです。CaptureFromCAM()

import cv
capture = cv.CaptureFromCAM(-1)
if not capture:
    print "Unable to open device #-1"
    sys.exit(1) 

引数として送信-1すると、OpenCV はデフォルトのカメラ デバイスを開くように指示されます。一部のシステムではこれが機能せず、数を増やす必要があります。0、 、 、 、 、 、 、 、 、 、 、 、 と 、 、 と、 、 、1と、を 通過 して み て ください2

2 番目に行う必要があるのQueryFrame()有効なものも返すようにすることです。

img = cv.QueryFrame(capture)
if not img:
    print "Unable to retrieve frame from the device"
    sys.exit(1) 

OpenCV の Python API と C (さらには C++) API の間で奇妙な動作が見られました。上記のいずれも問題の解決に役立たない場合は、OpenCV を使用して (最も信頼性の高い API を備えた) C プログラムをコンパイルして、カメラからデータを取得することをお勧めします。場合によっては、OpenCV の C API が機能し、Python が機能しないことがあります。

この C プログラムは、カメラからフレームを取得し、ウィンドウに表示します。

#include <stdio.h>
#include <highgui.h>
#include <cv.h>

int main() 
{
CvCapture* capture = NULL;
if ((capture = cvCaptureFromCAM(-1)) == NULL)
{
    fprintf(stderr, "ERROR: capture is NULL \n"); 
    return -1;
}

cvNamedWindow("mywindow", CV_WINDOW_AUTOSIZE);

cvQueryFrame(capture); // Sometimes needed to get correct data

while (1) 
{     
    IplImage* frame = cvQueryFrame(capture); // check return
    {
        fprintf( stderr, "ERROR: cvQueryFrame failed\n");
        break;
    }

    // At this point you already have the frame! There's no need to
    // repeat the thing 10x with cvGrabFrame and cvRetrieveFrame. 
    // You are probably sabotaging yourself doing this multiple times.

    cvShowImage("mywindow", frame); // Do not release the frame!

    int key = cvWaitKey(10);
    if (key  == 0x1b)
        break;
}    

cvReleaseCapture(&capture);   
cvDestroyWindow("mywindow");   

return 0;
}
于 2013-03-15T18:15:26.910 に答える
1

これが答えになるかどうかはわかりません。以下を試してみてください。

カメラのドライバーがサポートされていないのでしょう。カメラをボードに接続し、ターミナルに「dmesg」と入力して、カメラのメーカー名が検出されるかどうかを確認します。

メーカー名がメッセージのどこにもない場合、カメラ ドライバーは端末からインストールされます。

opkg update
opkg install kernel-module-uvcvideo
modprobe uvcvideo

上記の手順で問題が解決しない場合は、VLC メディア プレーヤーまたはカメラからのビデオ入力をサポートするその他のプレーヤーをインストールしてみてください。:)

于 2013-03-11T06:42:26.423 に答える
0
  1. V4L2 アプリケーションを使用して、コードを使用せずにカメラをテストしてみてください。ダウンロードしてカメラをテストできる Qt V4L2 ソフトウェアがあります。
  2. ステップ 1 が失敗した場合は、カメラ ドライバーに問題があり、サポートされていません。
  3. ステップ 1 が成功した場合は、コードを確認し、gstreamer または準備ができている V4L2 キャプチャ サンプルを使用してみてください。

カメラが認識されるという問題に直面しましたが、ドライバーにはバグがあるため、最初にカメラのドライバーがカーネルで本当にサポートされているかどうかを確認してください。カメラのモデルについて言及することも有効です。MIPIと USBのどちらのインターフェイスですか? ドライバーの問題だと思います。

于 2013-03-17T23:47:44.910 に答える