たとえば、ビデオストリームをリアルタイムでスキャンしてQRコード情報を取得するQRスキャナーがあります。ビデオから光源を確認したいのですが、オンかオフかはかなりパワフルなので問題ありません。
私はおそらくビデオストリームを入力として受け取り、おそらくそれの画像を作成し、画像を分析するか、光源の存在についてリアルタイムでストリーミングします(おそらく画像上の特定の色のピクセル数?)
この問題にどのようにアプローチしますか?たぶん、ライブラリのソースがありますか?
たとえば、ビデオストリームをリアルタイムでスキャンしてQRコード情報を取得するQRスキャナーがあります。ビデオから光源を確認したいのですが、オンかオフかはかなりパワフルなので問題ありません。
私はおそらくビデオストリームを入力として受け取り、おそらくそれの画像を作成し、画像を分析するか、光源の存在についてリアルタイムでストリーミングします(おそらく画像上の特定の色のピクセル数?)
この問題にどのようにアプローチしますか?たぶん、ライブラリのソースがありますか?
いくつかの慎重な手順についての情報を求めているようです。それぞれを行う方法は多数あります。個々のステップで行き詰まった場合は、個別に質問を投稿することをお勧めします。
1:ビデオフレームを取得する
chaitanya.varanasiが言ったように、AVFoundation Frameworkは、IOSでビデオフレームにアクセスするための最良の方法です。柔軟性が低く、より迅速なものが必要な場合は、OpenCVのビデオキャプチャをご覧ください。このステップの目標は、カメラからピクセルバッファーにアクセスすることです。これで問題が発生した場合は、具体的に質問してください。
2:ピクセルバッファをOpenCVに入れます
この部分は本当に簡単です。openCVのビデオキャプチャから取得した場合は、すでに完了しています。AVFoundationから取得する場合は、このようにopenCVに入れる必要があります
//Buffer is of type CVImageBufferRef, which is what AVFoundation should be giving you
//I assume it is BGRA or RGBA formatted, if it isn't, change CV_8UC4 to the appropriate format
CVPixelBufferLockBaseAddress( Buffer, 0 );
int bufferWidth = CVPixelBufferGetWidth(Buffer);
int bufferHeight = CVPixelBufferGetHeight(Buffer);
unsigned char *pixel = (unsigned char *)CVPixelBufferGetBaseAddress(Buffer);
cv::Mat image = cv::Mat(bufferHeight,bufferWidth,CV_8UC4,pixel); //put buffer in open cv, no memory copied
//Process image Here
//End processing
CVPixelBufferUnlockBaseAddress( pixelBuffer, 0 );
タグを使用したので、OpenCVでこれを行う予定であることに注意してください。また、OpenCVフレームワークをプロジェクトにリンクさせることができると思います。それが問題である場合は、それについて具体的な質問をしてください。
3:プロセス画像
この部分は、これまでで最もオープンエンドです。あなたがあなたの問題について言ったのは、あなたが強い光源を検出しようとしているということだけです。これを行う非常に迅速で簡単な方法の1つは、グレースケール画像の平均ピクセル値を検出することです。画像をカラーで取得した場合は、cvtColorで変換できます。次に、その上でAvgを呼び出して、平均値を取得します。うまくいけば、その値がどのように変動するかによって、ライトが点灯しているかどうかがわかります。
chaitanya.varanasiは別のオプションを提案しました、あなたもそれをチェックするべきです。
openCVは非常に大きなライブラリであり、さまざまなことを実行できます。あなたの問題についてもっと知らなければ、私はあなたに他に何を言うべきかわかりません。
AppleのAVFoundationフレームワークを見てください。
それが役に立てば幸い!
この方法を試すことができます。まず、すべての画像をに取得しますAVCaptureVideoDataOutput
。方法から:captureOutput:didOutputSampleBuffer:fromConnection
、すべてのピクセルをサンプリング/計算できます。出典:回答
また、このSOの質問を見て、ピクセルが黒かどうかを確認することもできます。そのような強力な光源の場合は、ピクセルの逆数を取り、黒に設定されたしきい値を使用して決定できます。
上記のサンプルコードは、バッファに保存されているピクセル値へのアクセスのみを提供します。他のコマンドを実行することはできませんが、ピクセルごとにこれらの値を変更するコマンドは次のとおりです。
for ( uint32_t y = 0; y < height; y++ )
{
for ( uint32_t x = 0; x < width; x++ )
{
bgraImage.at<cv::Vec<uint8_t,4> >(y,x)[1] = 0;
}
}
これは、例を使用すると、指定したコードでは機能しません。
cv::Mat bgraImage = cv::Mat( (int)height, (int)extendedWidth, CV_8UC4, base );
cv::Mat grey = bgraImage.clone();
cv::cvtColor(grey, grey, 44);