OpenCV 3.0.0 for raspberry pi の続き
前回何とかコンパイルするところまで行ったわけですが、これをそのままインストールしても
アプリケーションのコンパイルでつまづくことが判明しました。
理由は2つあります。
- arm-linux-gnueabihf-pkg-config の書き換えが必要
- open.pc の prefix を工夫する必要がある
GitHub から持ってきた pkg-config は古いことは前回触れましたが、0.28 をコンパイル
して arm-linux-gnuabihf-pkg-config-real2 とか言う名前にしたとします。
arm-linux-gnueabihf-pkg-config を以下のように書き換えます。
#!/bin/sh # # Wrapper script that calls the real pkg-config with the relocated # sysroot location # set -e GCC="${0%%-pkg-config}-gcc" MACHINE=`"$GCC" -dumpmachine` SYSROOT="${ROOTDIR}" export PKG_CONFIG_SYSTEM_INCLUDE_PATH= export PKG_CONFIG_SYSTEM_LIBRARY_PATH= export PKG_CONFIG_SYSTEM_ALLOW_SYSTEM_CFLAGS=1 export PKG_CONFIG_SYSTEM_ALLOW_SYSTEM_LIBS=1 export PKG_CONFIG_DIR= export PKG_CONFIG_LIBDIR="${SYSROOT}/usr/local/ffmpeg/lib/pkgconfig":"${SYSROOT}/usr/lib/${MACHINE}/pkgconfig":"${SYSROOT}/usr/lib/pkgconfig":"${SYSROOT}/usr/share/pkgconfig" export PKG_CONFIG_SYSROOT_DIR="${SYSROOT}" #exec "$0-real" "$@" exec "$0-real2" "$@"
次に
/opt/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/root/usr/local/ffmpeg/lib/pkgconfig/opencv.pc
ファイルの prefix を
prefix=/usr/local/ffmpeg
と書き換えます。(SYSROOT はすでに指定済みなので、このままでは二重に指定することに
なってしまうため)
OpenCV を利用するアプリケーションの Makefile は、例えば以下のようになります。
TARGET=camera SRC=camera.cc OBJ=$(SRC:.cc=.o) CC=$(CROSS_COMPILE)gcc CXX=$(CROSS_COMPILE)g++ PKGCONFIG=$(CROSS_COMPILE)pkg-config # for Pi2 Only binary COMMON_FLAGS=-mcpu=cortex-a7 -mfpu=neon-vfpv4 # for PiB+/2B binary #COMMON_FLAGS=-march=armv6 -mfpu=vfp COMMON_FLAGS+=-mfloat-abi=hard INCLUDES=`$(PKGCONFIG) --cflags opencv` LDFLAGS=$(COMMON_FLAGS) `$(PKGCONFIG) --libs opencv` ${CROSS_LIBDIRS} ${CROSS_LINKDIRS} CFLAGS=$(COMMON_FLAGS) $(INCLUDES) $(TARGET): $(OBJ) $(CXX) -o $(TARGET) $(OBJ) $(LDFLAGS) .cc.o: $(CXX) $(CFLAGS) -c $< clean: -rm *.o $(TARGET)
ちなみに 3.0.0 で cap.set() すると VIDEOIO ERROR: V4L/V4L2: VIDIOC_CROPCAP という
エラーが出力され、画像が乱れます。2.4.1 ではこんなことなかったのに...
resize() に失敗する場合があったり、ちょっと不安定です。