先日raspberry piでウワサのOpenCVをインストールしてみた。インテルが開発したオープンソースの画像処理らしいけど、気軽な気持ちでやれるシロモノではなかった。
まずインストールする前のビルド?で大苦戦した。
こちらの記事を参考にさせて頂いたのだが、ビルド用のディレクトリを作った後ハマってしまった
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D INSTALL_PYTHON_EXAMPLES=ON -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.1.0/modules -D BUILD_EXAMPLES=ON ..
この後ビルド5%~12%ぐらいで以下のエラーが出て中断。
/usr/include/c++/6/cstdlib:75:25: fatal error: stdlib.h: そのようなファイルやディレクトリはありません
#include_next <stdlib.h>
arduinoでC言語っぽいもの?は勉強していたもののさっぱりわからず。
いろいろ調べると -D ENABLE_PRECOMPILED_HEADERS=OFF というのを加えると解決した。
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D
INSTALL_PYTHON_EXAMPLES=ON -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.1.0/modules -D
BUILD_EXAMPLES=ON -D ENABLE_PRECOMPILED_HEADERS=OFF ..
これでなんとかビルドできたのだがインストール後にサンプルのpythonコードを使って確認しようとすると
ImportError: No module named cv2 と出てインポートできず・・
とりあえずpythonのシェルモードで確認するとバージョン2.7のみimportが反応した。どうやら
ラズパイのコンソールThonnyがpython3.5.2だったためエラーになったみたいだ。
LXターミナルから sudo python ファイル名でたたくとなんとか動作した。(python2.7で起動)
長かった・・。 ついでなのでサンプルコードを少しいじって顔を認識するとLEDが光る様にしてみた。(GPIO18ピン使用)
# -*- coding: utf-8 -*-
import sys
import cv2
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)
if _name_ == '_main_':
try:
cascade_path = "haarcascade_frontalface_alt.xml"
cascade = cv2.CascadeClassifier(cascade_path)
capture = cv2.VideoCapture(0)
if capture.isOpened() is False:
raise IOError("VideoCapture could not open.")
while True:
ret, image = capture.read()
if ret == False:
continue
facerect = cascade.detectMultiScale(image, scaleFactor=1.2, minNeighbors=2, minSize=(10, 10))
color = (255, 255, 255)
for rect in facerect:
cv2.rectangle(image, tuple(rect[0:2]),tuple(rect[0:2] + rect[2:4]), color, thickness=2)
GPIO.output(18, True)
time.sleep(1)
GPIO.output(18, False)
cv2.imshow("FaceDetection", image)
#wait[ms]
cv2.waitKey(10)
except KeyboardInterrupt :
print("\nCtl+C")
except Exception as e:
print(str(e))
finally:
capture.release()
cv2.destroyAllWindows()
for i in range (1,5):
cv2.waitKey(10)
print("\nexit program")
GPIO.cleanup(18)
今回はハマるポイントが多くてキツかったです!!