読者です 読者をやめる 読者になる 読者になる

徒然なる日々を送るソフトウェアデベロッパーの記録(2)

技術上思ったことや感じたことを気ままに記録していくブログです。さくらから移設しました。

OpenCV 3.0.0 for raspberry pi の続き

OpenCV raspberry pi

前回何とかコンパイルするところまで行ったわけですが、これをそのままインストールしても
アプリケーションのコンパイルでつまづくことが判明しました。

理由は2つあります。

  1. arm-linux-gnueabihf-pkg-config の書き換えが必要
  2. 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() に失敗する場合があったり、ちょっと不安定です。