USBカメラ接続 - takgto/utokyo-chipathon2023 GitHub Wiki
まず、基板のUSBポートにUSBカメラを接続します。
VSCodeでFPGAに接続し、ターミナルに以下のコマンドを入力して~/Vitis-AI/examples/VART/yolov3フォルダを開きます。
(ターミナル)
code ~/Vitis-AI/examples/VART/yolov3
yolov3_video_subject1.cpp
のソースコードにカメラから映像を取得するコードを追加します。基にするソースコードをコピーし、ファイル名を例えばyolov3_video_subject1_camera.cpp
等に変更してからコード編集すると安心です。
カメラ映像は640×480サイズにリサイズしてフレーム取得します。
動画を読み込んでいる箇所を削除します。以下の行を削除します。
VideoCapture video;
if (!video.open(argv[2])) {
cout << "Fail to open specified video file:" << argv[2] << endl;
exit(-1);
}
代わりに、以下の行を追加します。while文の外に書いてください。
USBカメラデバイスをオープンして、画像のサイズを設定しています。
VideoCapture video(0);//デバイスのオープン
video.set(cv::CAP_PROP_FRAME_WIDTH, 640);
video.set(cv::CAP_PROP_FRAME_HEIGHT, 480);
最後に、映像入力を削除します。この修正はしなくてもカメラ画像を取得できますが、その場合は引数に不要な映像ファイル名が必要です。 上記の修正でargv[2]を使用する箇所は削除されているはずです。main関数で引数のチェックをしている箇所を削除すれば、引数を1つ(xmodelのファイル名のみ)にすることができます。
以下の行を削除します。
// Check args
if (argc != 3) {
cout << "Usage of yolov3: ./resnet50 [model_file] [jpg image]" << endl;
// #of images = batch size
return -1;
}
代わりに、以下の行を追加します。
// Check args
if (argc != 2) {
cout << "Usage of yolov3: ./resnet50 [model_file]" << endl;
// #of images = batch size
return -1;
}
できたら保存してください。
作成したソースコードをコンパイルします。
SSHコンソールに以下のコマンドを入力します。ファイル名は作成したファイル名を指定します。
cd ~/Vitis-AI/examples/VART/yolov3
./make.sh yolov3_video_subject1_camera.cpp
実行します。
SSHコンソールに以下のコマンドを入力します。
./yolov3 dpu_yolov3-608.xmodel
項番5と同様に画像が表示されます。
yolov3_video_study.cpp
をカメラ入力に変更したい場合は、このソースコードはマルチスレッドなので、やり方が少し変わります。カメラから映像を取得するコードを追加するには、関数を追加してください。
capFrame関数はカメラ入力からフレームを取得する関数です。
基にするソースコードをコピーし、ファイル名を例えばyolov3_video_study_camera.cpp
等に変更してからコード編集しましょう。
以下の関数を、main関数の上に記述してください。VSCodeでmain
を検索して探してください。
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
を検索して探してください。
thread(readFrame, argv[2], ref(fr)),
この行を以下のように修正します。
thread(capFrame, ref(fr)),
最後に、yolov3_video_subject_camera.cpp
の変更と同様に映像入力を削除します。この修正はしなくてもカメラ画像を取得できますが、その場合は引数に不要な映像ファイル名が必要です。
以下の行を削除します。
// Check args
if (argc != 3) {
cout << "Usage of yolov3: ./resnet50 [model_file] [jpg image]" << endl;
// #of images = batch size
return -1;
}
代わりに、以下の行を追加します。
// Check args
if (argc != 2) {
cout << "Usage of yolov3: ./resnet50 [model_file]" << endl;
// #of images = batch size
return -1;
}
作成したソースコードをコンパイルします。
SSHコンソールに以下のコマンドを入力します。ファイル名は作成したファイル名を指定します。
cd ~/Vitis-AI/examples/VART/yolov3
./make.sh yolov3_video_study_camera.cpp
実行します。
SSHコンソールに以下のコマンドを入力します。
./yolov3 dpu_yolov3-608.xmodel
項番5と同様に画像が表示されます。