USBカメラ接続 - takgto/utokyo-chipathon2023 GitHub Wiki

まず、基板のUSBポートにUSBカメラを接続します。

VSCodeでFPGAに接続し、ターミナルに以下のコマンドを入力して~/Vitis-AI/examples/VART/yolov3フォルダを開きます。

VSCode(ターミナル)

code ~/Vitis-AI/examples/VART/yolov3

yolov3_video_subject1.cppのソースコードにカメラから映像を取得するコードを追加します。基にするソースコードをコピーし、ファイル名を例えばyolov3_video_subject1_camera.cpp等に変更してからコード編集すると安心です。
カメラ映像は640×480サイズにリサイズしてフレーム取得します。

動画を読み込んでいる箇所を削除します。以下の行を削除します。

VSCode

    VideoCapture video;
    if (!video.open(argv[2])) {
      cout << "Fail to open specified video file:" << argv[2] << endl;
      exit(-1);
    }

代わりに、以下の行を追加します。while文の外に書いてください。
USBカメラデバイスをオープンして、画像のサイズを設定しています。

VSCode

    VideoCapture video(0);//デバイスのオープン
    video.set(cv::CAP_PROP_FRAME_WIDTH, 640);
    video.set(cv::CAP_PROP_FRAME_HEIGHT, 480);

最後に、映像入力を削除します。この修正はしなくてもカメラ画像を取得できますが、その場合は引数に不要な映像ファイル名が必要です。 上記の修正でargv[2]を使用する箇所は削除されているはずです。main関数で引数のチェックをしている箇所を削除すれば、引数を1つ(xmodelのファイル名のみ)にすることができます。

以下の行を削除します。

VSCode

    // Check args
    if (argc != 3) {
        cout << "Usage of yolov3: ./resnet50 [model_file] [jpg image]" << endl;
        // #of images = batch size 
        return -1;
    }

代わりに、以下の行を追加します。

VSCode

    // Check args
    if (argc != 2) {
        cout << "Usage of yolov3: ./resnet50 [model_file]" << endl;
        // #of images = batch size 
        return -1;
    }

できたら保存してください。

作成したソースコードをコンパイルします。
SSHコンソールに以下のコマンドを入力します。ファイル名は作成したファイル名を指定します。

SSH

cd ~/Vitis-AI/examples/VART/yolov3
./make.sh yolov3_video_subject1_camera.cpp

実行します。
SSHコンソールに以下のコマンドを入力します。

SSH

./yolov3 dpu_yolov3-608.xmodel

項番5と同様に画像が表示されます。

yolov3_video_study.cppをカメラ入力に変更したい場合は、このソースコードはマルチスレッドなので、やり方が少し変わります。カメラから映像を取得するコードを追加するには、関数を追加してください。
capFrame関数はカメラ入力からフレームを取得する関数です。
基にするソースコードをコピーし、ファイル名を例えばyolov3_video_study_camera.cpp等に変更してからコード編集しましょう。
以下の関数を、main関数の上に記述してください。VSCodeでmainを検索して探してください。

VSCode

void capFrame(concurrent_queue<imagePair>& out) {
    VideoCapture cap(0);//デバイスのオープン
    cap.set(cv::CAP_PROP_FRAME_WIDTH, 640);
    cap.set(cv::CAP_PROP_FRAME_HEIGHT, 480);

    start_time = chrono::system_clock::now();

    Mat frame; //取得したフレーム
    while (cap.read(frame))//無限ループ
    {
        auto pair = make_pair(idxInputImage++, frame);
        end_time =  chrono::system_clock::now();
        //cout << "\nread img time= " << 
        //	    std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_readtime).count() 
        //	    << " [mS]" << endl; 
        out.push(pair);
        //cout << "index=" << idxInputImage << "\n" << flush;
        //cout << "q size=" << queueInput.size() << "\n" << flush;
    }
    destroyAllWindows();
    exit(0);
}

次に、映像取得処理部分を修正します。readFrame関数(映像ファイルからフレームを取得する関数)を使用していた処理を追加したcapFrame関数に変更します。readFrameを検索して探してください。

VSCode

        thread(readFrame, argv[2], ref(fr)), 

この行を以下のように修正します。

VSCode

        thread(capFrame, ref(fr)), 

最後に、yolov3_video_subject_camera.cppの変更と同様に映像入力を削除します。この修正はしなくてもカメラ画像を取得できますが、その場合は引数に不要な映像ファイル名が必要です。

以下の行を削除します。

VSCode

    // Check args
    if (argc != 3) {
        cout << "Usage of yolov3: ./resnet50 [model_file] [jpg image]" << endl;
        // #of images = batch size 
        return -1;
    }

代わりに、以下の行を追加します。

VSCode

    // Check args
    if (argc != 2) {
        cout << "Usage of yolov3: ./resnet50 [model_file]" << endl;
        // #of images = batch size 
        return -1;
    }

作成したソースコードをコンパイルします。
SSHコンソールに以下のコマンドを入力します。ファイル名は作成したファイル名を指定します。

SSH

cd ~/Vitis-AI/examples/VART/yolov3
./make.sh yolov3_video_study_camera.cpp

実行します。
SSHコンソールに以下のコマンドを入力します。

SSH

./yolov3 dpu_yolov3-608.xmodel

項番5と同様に画像が表示されます。

⚠️ **GitHub.com Fallback** ⚠️