Java for Androidのコンピュータービジョン。 BoofCVライブラリの概要

おそらく、すべてのAndroidプログラマーは、コンピュータービジョンまたは拡張現実を使用して有用なものを書くことを少なくとも一度考えました。 また、opencvを使用してhelloを作成し、Androidにも移植しました。 残念ながら、何か深刻なものを書きたい場合、コンピュータービジョン機能が既に実装されているライブラリセットは、特にAndroidプラットフォームではそれほど大きくないことがわかります。 ほとんどの場合、彼らはこの目的のためにC ++で書かれたopencvを使用するか、独自のバイクを作成します。 しかし、すべてがそれほど悪いわけではありません。 このような素晴らしいBoofCVプロジェクトがあります。これは、純粋なJavaで記述されたコンピュータービジョンライブラリです。 ライブラリー名の最後の2文字は、あなたが思ったとおりのものです。 そして最新リリースでは、待望のAndroidのサポートが登場しました。 以下では、特定の例を使用して、ライブラリによって提供される主な利点を検討します。



BoofCV-簡単な説明





したがって、BoofCVは、純粋なJavaで記述されたオープンソースのコンピュータービジョンライブラリです。 内部で使用されるアルゴリズムは最適化されており、実践が示すように、場合によっては速度はC ++ opencvの実装に劣りません。 ライブラリの主な機能:

•ビデオカメラとWebカメラを使用します。

•3Dコンピュータービジョン。

•フィルター(ぼかし、グラデーション)、ノイズクリーニング(ウェーブレットを使用)。

•二値化、モルフォロジー演算。

•境界線を強調する(Canny、Sobel)。

•興味のあるポイントを検索します。

•線、セグメント、長方形の検索。

•ステレオ画像。



さらに、ライブラリにはコンピュータービジョンで使用されるより多くの関数が含まれています。 ライブラリは非常に簡単に接続されます-公式サイトからソースをダウンロードして自分でビルドするか、既に収集されたjarファイルをダウンロードしてプロジェクトに接続するだけです。



実験のために、次の写真を撮ってください。







まず、ガウスぼかしを試してみましょう。







このような画像を取得するには、BlurImageOps.gaussian関数を使用します。

//以下、画像はImageUInt8型の元の画像です



ImageUInt8 blurred = new ImageUInt8(image.width,image.height) ImageUInt8 blurred = new ImageUInt8(image.width,image.height); BlurImageOps.gaussian(image,blurred,-1,5,null);
      
      







次に、元の画像にノイズを追加してフィルタリングします。









ノイズを追加および削除します。



 Random rand = new Random(234); ImageUInt8noisy = image.clone(); GeneralizedImageOps.addGaussian(noisy,rand,20,0,255); ImageUInt8denoised = new ImageFloat32(ImageUInt8.width, ImageUInt8.height); int numLevels = 4; WaveletDenoiseFilter< ImageUInt8> denoiser = FactoryImageDenoise.waveletBayes(ImageUInt8.class,numLevels); denoiser.process(noisy,denoised);
      
      







境界を強調する:







コード:



私は
 mageUInt8 canny = new ImageUInt8(image.width,image.height); //Canny DetectEdgeContour<ImageUInt8> simple = FactoryDetectEdgeContour.canny(30,200,false,ImageUInt8.class,ImageSInt16.class); simple.process(image); List<List<Point2D_I32>> edges = simple.getContours(); for( List<Point2D_I32> l : edges ) { for( Point2D_I32 p : l ) { canny.set(px,py, 255); } }
      
      







画像の二値化:







コード:



 ImageUInt8 binary = new ImageUInt8(image.width,image.height); float mean = PixelMath.sum(image)/(image.width*image.height); ThresholdImageOps.threshold(image, binary,mean,false);
      
      







二値化された画像マークアップ:







コード:



 ImageSInt32 blobs = new ImageSInt32(image.width, image.height); int numBlobs = BinaryImageOps.labelBlobs4(binary,blobs);
      
      







興味のあるポイントを検索:







記事を煩雑にしないために、コードには例を挙げません。例はマニュアルにあります。



そして、ここで論理的な疑問が生じます-Androidはどこにありますか? Androidでライブラリを使用するために、Android形式からBoofCVライブラリ形式へ、またはその逆に変換するためのメソッドを含むConvertBitmapクラスがあります。

たとえば、次のように:

 Bitmap map = BitmapFactory.decodeResource(getResources(), R.drawable.car5); ImageUInt8 image = ConvertBitmap.bitmapToGray(map, (ImageUInt8)null, null);
      
      







結論:





もちろん、これはライブラリのすべての機能のほんの一部です。 BoofCVの機能によると、もちろんopencvのようなモンスターには負けます。 ただし、BoofCVを使用すると、Androidのコンピュータービジョンに入るためのしきい値が大幅に低下します。

同時に、ライブラリは優れたパフォーマンスを示したため、リアルタイムシステムで使用できます。 そのため、写真のサイズに応じて、必要なパラメーター(車の番号など)を使用した長方形の検索とローカライズに約0.2〜0.5秒かかります。 ライブラリは十分に文書化されています。



All Articles