新旧Android 4機種のNEON対応


(2011-04-14 一部修正)

samurai-appsでは、今年に入ってAndroid開発機を一気に増強し、次の4台になりました。

  • NTTドコモ HT-03A (HTC Magic)
  • イーモバイル PocketWiFi S (Huawei IDEOS U8150)
  • NTTドコモ Xperia arc SO-01C (Sony Ericsson)
  • Motorola Xoom WiFi

今後これらを駆使してプラットフォーム対応の向上を目指して参ります。

各機の違いをみるため、次期Tegraでは搭載されるという噂もあるARM版SIMD命令”NEON”について調べてみました。 続きを読む

さくらインターネットサーバーにOpenCV 2.1.1を入れる


English is here

cmakeをインストール

%cd ~/local/src
%wget http://www.cmake.org/files/v2.8/cmake-2.8.2.tar.gz
%tar xvf cmake-2.8.2.tar.gz
%cd cmake-2.8.2
%./bootstrap --prefix=$HOME/local
%make
%make install

OpenCVのインストール

%mkdir OpenCV-2.1.1
%cd OpenCV-2.1.1
%svn export https://code.ros.org/svn/opencv/trunk
%cd ..
%mkdir opencv.bulid
%ccmake ../OpenCV-2.1.1/trunk/opencv

設定項目は下記の通りにしました.(ccmakeに入ったあと,c(continue)を押下したあと,t(toggle advanced mode)を押下して,アドバンスドモードで設定)

BUILD_EXAMPLES                   OFF
BUILD_LATEX_DOCS                 OFF
BUILD_NEW_PYTHON_SUPPORT         ON
BUILD_PACKAGE                    OFF
BUILD_SHARED_LIBS                ON
BUILD_TESTS                      ON
BZIP2_LIBRARIES                  /usr/lib/libbz2.so
CMAKE_AR                         /usr/bin/ar
CMAKE_BACKWARDS_COMPATIBILITY    2.4
CMAKE_BUILD_TYPE                 RELEASE
CMAKE_COLOR_MAKEFILE             ON
CMAKE_CONFIGURATION_TYPES        Debug;Release
CMAKE_CXX_COMPILER               /usr/bin/c++
CMAKE_CXX_FLAGS
CMAKE_CXX_FLAGS_DEBUG            -g
CMAKE_CXX_FLAGS_RELEASE          -O3 -DNDEBUG
CMAKE_C_COMPILER                 /usr/bin/gcc
CMAKE_C_FLAGS
CMAKE_C_FLAGS_DEBUG              -g
CMAKE_C_FLAGS_RELEASE            -O3 -DNDEBUG
CMAKE_EXE_LINKER_FLAGS
CMAKE_EXE_LINKER_FLAGS_DEBUG
CMAKE_EXE_LINKER_FLAGS_RELEASE
CMAKE_INSTALL_PREFIX             /home/USERNAME/local
CMAKE_LINKER                     /usr/bin/ld
CMAKE_MAKE_PROGRAM               /usr/local/bin/gmake
CMAKE_MODULE_LINKER_FLAGS
CMAKE_MODULE_LINKER_FLAGS_DEBU
CMAKE_MODULE_LINKER_FLAGS_RELE
CMAKE_NM                         /usr/bin/nm
CMAKE_OBJCOPY                    /usr/bin/objcopy
CMAKE_OBJDUMP                    /usr/bin/objdump
CMAKE_RANLIB                     /usr/bin/ranlib
CMAKE_SHARED_LINKER_FLAGS
CMAKE_SHARED_LINKER_FLAGS_DEBU
CMAKE_SHARED_LINKER_FLAGS_RELE
CMAKE_SKIP_RPATH                 OFF
CMAKE_STRIP                      /usr/bin/strip
CMAKE_USE_RELATIVE_PATHS         OFF
CMAKE_VERBOSE_MAKEFILE           OFF
DOXYGEN_DOT_EXECUTABLE           DOXYGEN_DOT_EXECUTABLE-NOTFOUND
DOXYGEN_EXECUTABLE               DOXYGEN_EXECUTABLE-NOTFOUND
EIGEN2_INCLUDE_PATH              EIGEN2_INCLUDE_PATH-NOTFOUND
ENABLE_PROFILING                 OFF
ENABLE_SSE                       ON
ENABLE_SSE2                      ON
ENABLE_SSE3                      OFF
ENABLE_SSSE3                     OFF
EXECUTABLE_OUTPUT_PATH           /home/USERNAME/local/src/opencv.bulid/bin
INSTALL_C_EXAMPLES               OFF
INSTALL_PYTHON_EXAMPLES          OFF
IPP_PATH                         IPP_PATH-NOTFOUND
JASPER_INCLUDE_DIR               /usr/local/include
JASPER_LIBRARY                   /usr/local/lib/libjasper.so
JPEG_INCLUDE_DIR                 /usr/local/include
JPEG_LIBRARY                     /usr/local/lib/libjpeg.so
LIBRARY_OUTPUT_PATH              /home/USERNAME/local/src/opencv.bulid/lib
OPENCV_BUILD_3RDPARTY_LIBS       OFF
OPENCV_CONFIG_FILE_INCLUDE_DIR   /home/USERNAME/local/src/opencv.bulid
OPENCV_EXTRA_C_FLAGS
OPENCV_EXTRA_C_FLAGS_DEBUG
OPENCV_EXTRA_C_FLAGS_RELEASE
OPENCV_EXTRA_EXE_LINKER_FLAGS
OPENCV_EXTRA_EXE_LINKER_FLAGS_
OPENCV_EXTRA_EXE_LINKER_FLAGS_
OPENCV_WARNINGS_ARE_ERRORS       OFF
OPENEXR_HALF_LIBRARY             OPENEXR_HALF_LIBRARY-NOTFOUND
OPENEXR_IEX_LIBRARY              OPENEXR_IEX_LIBRARY-NOTFOUND
OPENEXR_ILMIMF_LIBRARY           OPENEXR_ILMIMF_LIBRARY-NOTFOUND
OPENEXR_IMATH_LIBRARY            OPENEXR_IMATH_LIBRARY-NOTFOUND
OPENEXR_INCLUDE_PATH             OPENEXR_INCLUDE_PATH-NOTFOUND
PKG_CONFIG_EXECUTABLE            /usr/local/bin/pkg-config
PNG_LIBRARY                      /usr/local/lib/libpng.so
PNG_PNG_INCLUDE_DIR              /usr/local/include
PVAPI_INCLUDE_PATH               PVAPI_INCLUDE_PATH-NOTFOUND
PYTHON_EXECUTABLE                /usr/local/bin/python2.6
PYTHON_INCLUDE_DIR               /usr/local/include/python2.6
PYTHON_LIBRARY                   /usr/local/lib/libpython2.6.so
SVNVERSION_PATH                  /home/USERNAME/local/bin/svnversion
TIFF_INCLUDE_DIR                 /usr/local/include
TIFF_LIBRARY                     /usr/local/lib/libtiff.so
USE_FAST_MATH                    ON
USE_IPP                          OFF
USE_O3                           ON
USE_OMIT_FRAME_POINTER           ON
WITH_1394                        OFF
WITH_CUDA                        OFF
WITH_EIGEN2                      ON
WITH_FFMPEG                      OFF
WITH_GSTREAMER                   ON
WITH_GTK                         ON
WITH_JASPER                      ON
WITH_JPEG                        ON
WITH_OPENEXR                     ON
WITH_PNG                         ON
WITH_PVAPI                       ON
WITH_QT                          OFF
WITH_QT_OPENGL                   OFF
WITH_TBB                         OFF
WITH_TIFF                        ON
WITH_UNICAP                      OFF
WITH_V4L                         ON
WITH_XINE                        OFF
ZLIB_INCLUDE_DIR                 /usr/include
ZLIB_LIBRARY                     /usr/lib/libz.so

c(continue)押下後にg(generate and exit)を押してコンパイル設定完了.
ffmpegなんかも入れてみましたが,エラーしたのでOFFにしてます.

ソースをちょっとなおす.

%vi ../OpenCV-2.1.1/trunk/opencv/modules/highgui/src/grfmt_png.cpp

50行目くらい.

#ifdef HAVE_LIBPNG_PNG_H
#include <png.h>
#else
#include <png.h>
#endif
#include "grfmt_png.hpp"
%make

多分一回コンパイルに失敗するので,もう一回

%make

すると,コンパイル完了.

%make install

で,インストールされるはず.

OpenCVを使ったプログラムをコンパイルする

環境整備

%setenv PKG_CONFIG_PATH /home/USERNAME/local/lib/pkgconfig

これは,~/.cshrcに書いておけばよし.

%pkg-config --cflags --libs opencv
-I/home/USERNAME/local/include/opencv -I/home/USERNAME/local/include  -L/home/USERNAME/local/lib -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_contrib -lopencv_legacy

となれば準備完了.

プログラムのコンパイル

test.cpp – 2値化するプログラム

#include <cv.h>
#include <highgui.h>

int
main (int argc, char **argv)
{
  IplImage *src_img = 0, *dst_img;

  if (argc >= 2)
    src_img = cvLoadImage (argv[1], CV_LOAD_IMAGE_GRAYSCALE);
  if (src_img == 0)
    return -1;

  dst_img = cvCreateImage (cvGetSize (src_img), IPL_DEPTH_8U, 1);

  cvSmooth (src_img, src_img, CV_GAUSSIAN, 5);

  cvThreshold (src_img, dst_img, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);

  cvSaveImage( argv[2], dst_img);
  cvReleaseImage (&src_img);
  cvReleaseImage (&dst_img);

  return 0;
}

コンパイル.


%g++ -v -o test.o test.cpp `pkg-config --cflags --libs opencv ImageMagick++`

Using built-in specs.
Target: i386-undermydesk-freebsd
Configured with: FreeBSD/i386 system compiler
Thread model: posix
gcc version 4.2.1 20070719  [FreeBSD]
/usr/libexec/cc1plus -quiet -v -I/home/USERNAME/local/include/opencv -I/home/USERNAME/local/include -I/usr/local/include/ImageMagick -D_LONGLONG test2.cpp -quiet -dumpbase test2.cpp -auxbase test2 -version -o /var/tmp//cc80L5hQ.s
ignoring duplicate directory "/usr/include"
#include "..." search starts here:
#include <...> search starts here:
/home/USERNAME/local/include/opencv
/home/USERNAME/local/include
/usr/local/include/ImageMagick
/usr/include/c++/4.2
/usr/include/c++/4.2/backward
/usr/include
End of search list.
GNU C++ version 4.2.1 20070719  [FreeBSD] (i386-undermydesk-freebsd)
compiled by GNU C version 4.2.1 20070719  [FreeBSD].
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 32d3ad82329e6a2b39fccea1ee418a45
/usr/bin/as -o /var/tmp//ccHTucYA.o /var/tmp//cc80L5hQ.s
/usr/bin/ld --eh-frame-hdr -V -dynamic-linker /libexec/ld-elf.so.1 -o test.o /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtbegin.o -L/home/USERNAME/local/lib -L/usr/local/lib -L/usr/lib -L/usr/lib /var/tmp//ccHTucYA.o -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_contrib -lopencv_legacy -lMagick++ -lMagickCore -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/crtend.o /usr/lib/crtn.o
GNU ld version 2.15 [FreeBSD] 2004-05-23
Supported emulations:
elf_i386_fbsd

%./test.o test1.jpg test2.jpg

test.oができていればOK.

iPhone Programming : OpenCV + AVFoundation – First step of AR


OpenCV + AVFoundation – First step of AR
カメラからリアルタイムキャプチャして,OpenCVでFFTしたスペクトルをだすプログラム.
ARはこんなところから始まるんでしょう,という例です.

プロジェクトのダウンロード(Xcode Project – Source)

こんな感じのプログラムです.下の方に表示されているのはプレビュー画像,上がスペクトルです.

このプログラムに対して,samurai-appsは一切責任を持ちません.自己責任で,またサンプルとして利用してください.

Android + OpenGL ES 1.0 で必ず設定する項目


Android開発で、ちょっとキャッチーでレスポンスもよいUIを作ろうと思うと、OpenGL ESの利用は最重要検討事項となります。

OpenGLは、ステートマシン型のアーキテクチャーになっていますが、多くのステートには「デフォルト値」がないようで、設定必須の項目がいくつかあります。
私も新しいプログラムを書くたびにうまく描画されなくてしばし悩みます。

ということで、最低限必要と思われる項目をメモっておきます。
(GL10対応です)

ビューポートの設定

  • glViewport() : スクリーンのうち、描画に使われる範囲を、ピクセルで指定する

射影行列の設定

  • GLU.gluPerspective(), GLU.gluOrtho2D()など
  • 必要に応じて glMatrixMode(GL10.GL_PROJECTION), glLoadIdentity()  を先に呼び出す

頂点配列/インデックス配列利用の設定

  • glEnableClientState(GL10.GL_VERTEX_ARRAY) : OpenGL ESでは頂点配列が必須なので、この設定は必須

描画

  • glClearColor() : カラーバッファ消去時に塗りつぶしに使う色をセットする
  • glClear() : カラーバッファ or/and デプスバッファを消去する
  • glVertexArray() : 頂点配列をセットする
  • glDrawArrays() : セット済みの頂点配列で、線分/三角形を描画する
  • glDrawElements() : セット済みの頂点配列と、インデックス配列を使って、線分/三角形を描画する

iPhoneアプリをInterface Builderを使わずに開発する

iPhoneアプリケーションを開発する際,おそらく一番の難関の一つがInterface Builder(IB)です.

これは,Viewのレイアウトをするのには非常に便利なツールです.しかし,IBを用いると,MVCモデルでいう,VやCがブラックボックス化してしまう可能性があります.よって,より難しい構成のアプリケーションを作る場合は,このブラックボックス化している部分を理解していないことが足かせとなることがあります.

例えば,動的に,あるいは大量にUILabelを作る場合,UILabelを生成する部分はfor文で書きたい…といった場合は,プログラマブルに書いた方がずっと楽に書けることが多くあります.公開中のアプリケーションであるcalologでは,食品と,そのカロリーを書いたUILabelが大量に並んでいます.これは,データはXMLで持っておき,それをfor文で呼び出しつつ,UILabelをXMLに応じて動的に生成しています.

だいたいの入門書はIBを使ったものですが,この本に関してはIBをつかわないプログラミング手法が,多数の例をもって紹介されています.掲載されているプログラムも,ところどころ省略されているものではなく,すべてが掲載されているので非常に読みやすい.おすすめです.

ただ,UIViewとUIViewControllerの使い分け,がよくわからない.MVCモデルでいう,VがUIView,CがUIViewControllerだという認識だけど,UIViewControllerに描画部分も書けてしまう.無理に分けなくてもいいんでしょうが…

Android用ソフトウェア開発中


Android用アプリも開発中です。いつになるかな。

- munepi

© 2017 samurai-apps. All rights reserved. Powered by WordPress Entries RSS Comments RSS