Armadilloフォーラム

Armadillo-810でのVideoCaptureを用いたカメラ画像キャプチャの件

m-koseki

2018年7月12日 16時25分

Armadillo-810のカメラ画像データのキャプチャをおこなっていますが、
VideoCapture cap(1);
if (!cap.isOpened()) {
printf("Camera is open error\n");
return -1;
}
上記カメラオープン処理後、下記処理を無限ループにて実行していますが、
cap >> inputImage;
if (inputImage.empty())
printf("capture error\n");
else
imwrite("capImage.jpg", inputImage);
ファイル名を変更しながら実行したところ、撮影対象を変えているにも関わらず5回目までの"cap >> inputImage"の実行では同じ画像データが出力されました。
6回目の実行時に変更された撮影対象の画像データが出力されています。

本現象はどのような要因で起きるのでしょうか。
ご教示のほどお願いいたします。

コメント

at_ohsawa

2018年7月13日 10時02分

> ファイル名を変更しながら実行したところ、撮影対象を変えているにも関わらず5回目までの"cap >> inputImage"の実行では同じ画像データが出力されました。
> 6回目の実行時に変更された撮影対象の画像データが出力されています。

状況がわかりかねるので教えてください。
視覚的に同一というわけではなく、データが全く同じで5回取得されるのでしょうか。
また7枚目、4枚目といったバラつきはなく、動作毎に必ず6回目で異なるフレームが
取得できるようになるのでしょうか。

m-koseki

2018年7月13日 13時53分

> > ファイル名を変更しながら実行したところ、撮影対象を変えているにも関わらず5回目までの"cap >> inputImage"の実行では同じ画像データが出力されました。
> > 6回目の実行時に変更された撮影対象の画像データが出力されています。
>
> 状況がわかりかねるので教えてください。
> 視覚的に同一というわけではなく、データが全く同じで5回取得されるのでしょうか。
> また7枚目、4枚目といったバラつきはなく、動作毎に必ず6回目で異なるフレームが
> 取得できるようになるのでしょうか。

現象をうまく伝えられずすみません。

GPIOをトリガに"cap >> inputImage"を実行し、都度ファイル名を変更していますが、プログラム終了後に前記画像ファイルを確認したところ、5番目までの画像データはほぼ同じような撮像になっており、6番目で違う撮像になっています。
モニタを接続しているわけではないので、リアルタイムに撮像データを確認することはできていませんが、トリガで撮影するたびに撮影対象を変更しているはずなのに5番目までは同一撮像になっている状況です。

at_kojiro.yamada

2018年8月8日 14時22分

> > > ファイル名を変更しながら実行したところ、撮影対象を変えているにも関わらず5回目までの"cap >> inputImage"の実行では同じ画像データが出力されました。
> > > 6回目の実行時に変更された撮影対象の画像データが出力されています。
> >
> > 状況がわかりかねるので教えてください。
> > 視覚的に同一というわけではなく、データが全く同じで5回取得されるのでしょうか。
> > また7枚目、4枚目といったバラつきはなく、動作毎に必ず6回目で異なるフレームが
> > 取得できるようになるのでしょうか。
>
> 現象をうまく伝えられずすみません。
>
> GPIOをトリガに"cap >> inputImage"を実行し、都度ファイル名を変更していますが、プログラム終了後に前記画像ファイルを確認したところ、5番目までの画像データはほぼ同じような撮像になっており、6番目で違う撮像になっています。
> モニタを接続しているわけではないので、リアルタイムに撮像データを確認することはできていませんが、トリガで撮影するたびに撮影対象を変更しているはずなのに5番目までは同一撮像になっている状況です。

以下は、あくまで推測です。

おそらく、OpenCVがV4L2 APIを使って画像を取得する際に使う、バッファの数が5枚なのだと思います。
# V4L2を使ったカメラからの画像取得方法は以下のマニュアルに簡単な説明があります。
# https://manual.atmark-techno.com/armadillo-810/armadillo-810_product_ma…

正確なタイミングはわかりませんが、
VIDIOC_REQBUFS
VIDIOC_QUERYBUF
VIDIOC_QBUF
VIDIOC_STREAMON
が既に実行されており、
5枚のバッファに画像データが書き込まれてしまっているのだと思います。
VideoCapture >> が実行されると、バッファがひとつ空くため、新しい画像データがカメラから取得されて、
空いたバッファに書き込まれます。
そのため、6枚目の画像が撮影しようとした絵になるのではないでしょうか?