こんにちは。
今日は、ロボットのプログラムのコンパイル用の Makefile を作成したので、投稿します。
まず、ファイル構造を示します。
Makefile main.c main.h /SUB_A /SUB_B
| |
| | --sub_b.c sub_b.h _sub_.h
|
|
--sub_a.c sub_a.h _sub_a.h
次に、依存関係を示します。
main.c
---------------------------------------------------------------------
#include "./main.h"
#include "./SUB_A/sub_a.h"
#include "./SUB_B/sub_b.h"
.
.
.
.
---------------------------------------------------------------------
./SUB_A/sub_a.c
---------------------------------------------------------------------
#include "./sub_a.h"
#include "./_sub_a.h"
.
.
.
.
----------------------------------------------------------------------
./SUB_B/sub_b.c
----------------------------------------------------------------------
#include "./sub_b.h"
#include "./_sub_b.h"
.
.
.
.
-----------------------------------------------------------------------
main.out は main.o sub_a.o sub_b.o に依存
main.o は main.c main.h に依存
sub_a.o は sub_a.c sub_a.h _sub_a.h に依存
sub_b.o は sub_b.c sub_b.h _sub_b.h に依存
しているとします。
こんな感じだったとき、main.c のあるディレクトリと同じ所にMakefileを作成します。
Makefile
-----------------------------------------------------------------------------------------------------------------
#マクロ定義
CC = gcc #コンパイラはgccを使用
.PHONY : clean #本当のファイル名ではないターゲットをフォニーターゲット
(Phony target=偽のターゲット)といい、
明示的にコマンドを実行させたい時にこの名前を利用します
#===============================================================
# 何かソースを更新したら...
#
# 1. VPATH にそのソースの置いてあるディレクトリの相対パスを追加する。
# 追加するときは : をつけて追加すること。
#
# 2. SUB_SRC に追加したソースの.cファイルを追加する。
# 追加するときはスペースを開けて追加すること。
#
# 以上が、ソースを追加した時の使い方である。
# デバッグをしたい時は DEBUG のコメントアウトをとる。
# オプションを付けたい時は OPTION のコメントアウトをとる。
# どちらも何か追加したければ、スペースを開けて追加すること。
#===============================================================
PROG = main
#OPTION = -Wall
#DEBUG = -g -O0
VPATH = ./SUB_A:./SUB_B #makeの変数、VPATHの値にはmakeがサーチするディレクトリの
リストを指定します。ほとんどの場合、
指定するディレクトリは依存関係にあるが、
カレントディレクトリにはないファイルを含むディレクトリになります
MAIN_SRC = main.c
SUB_SRC = sub_a.c sub_b.c
SRCS = $(MAIN_SRC) $(SUB_SRC)
OBJS = $(SRCS:%.c=%.o)
HEADS = $(SRCS:%.c=%.h) $(SUB_SRC:%.c=_%.h)
all: $(PROG)
$(PROG) : $(OBJS) $(HEADS)
$(CC) -o $@ $(OPTION) $(DEBUG) $(OBJS)
$(PROG).o : $(PROG).c $(PROG).h
$(CC) -c $(OPTION) $(DEBUG) $<
%.o : %.c %.h _%.h
$(CC) -c $(OPTION) $(DEBUG) $<
clean :
rm $(OBJS)
-----------------------------------------------------------------------------------------------------------------------
こんな感じです。詳細を説明するのは骨が折れるので勘弁してください。
もしわからないことがあったら、コードをググったら大概の物は出てきます。
Makefile には色んなオプションや、マクロ定義があるので、調べてみてください。
Makefileについて参考にさせていただいたサイト↓
GNUMake3.77/make_4.jp
今載せているコードで何か質問がある場合は、投稿で聞いてください。
できる限り答えます!
次回は、TCP/IPの通信プログラムを投稿しようと思っているので、宜しくおねがいします。
2013年9月9日月曜日
2013年8月9日金曜日
MacOS X(Mountain Lion)でOpenCVを使ったコードをコマンドラインからコンパイル
OpenCVをMacからも使ってみようということでちょっとやってみたので紹介しようかなと。
OS X 10.9(Mavericks)のXcode5のgccでも動作しましたが、OS X 10.8.4からのアップデートした環境です。
MacPortsはいろいろググって入れます。んで
を打って放っておくと完了すると思います(パスワード聞かれるので入力してから放置)。そして適当なディレクトリ作ってOpenCVを使ったコードを書きましょう。以下では前回紹介したtrans90.cを使ってやってみます。このままでは通らないのでちょっとソースコードを書き直します。具体的にはincludeの<>を""に書き直し、保存します。そして保存したディレクトリに移動して
それでは今日はこのへんで。
環境
- MacOS X 10.8.4
- MacPorts 2.2.0
- OpenCV 2.4.6
- gcc 4.2.1 (Based on Apple Inc. build 5658)
OS X 10.9(Mavericks)のXcode5のgccでも動作しましたが、OS X 10.8.4からのアップデートした環境です。
やり方
まず、OpenCVをインストールする必要があります。今回はMacPortsを使ってインストールしました。MacPortsを使うにはgccが必要ですので、AppStoreからXcodeをインストールして、Command Line Toolsを入れます。ちなみにLionでgccを入れててMountain Lionにアップデートした場合も再度gccを入れる必要があります。MacPortsはいろいろググって入れます。んで
sudo port install opencv
を打って放っておくと完了すると思います(パスワード聞かれるので入力してから放置)。そして適当なディレクトリ作ってOpenCVを使ったコードを書きましょう。以下では前回紹介したtrans90.cを使ってやってみます。このままでは通らないのでちょっとソースコードを書き直します。具体的にはincludeの<>を""に書き直し、保存します。そして保存したディレクトリに移動して
gcc -I/opt/local/include -L/opt/local/lib trans90.c -lm -lopencv_core -lopencv_highgui -lopencv_imgproc -o trans90このように打てばコンパイルが通るとおもいます。 しかし、毎回コンパイルの度にこのように打っていては面倒なのでMakefileをつくってmakeを利用します。テキストエディタで
CC = gccこれを書いてMakefileという名前でソースコード(trans90.c)と同じディレクトリに保存します。そして
CFLAGS = -I/opt/local/include
LDFLAGS = -L/opt/local/lib
LDLIBS = -lm -lopencv_core -lopencv_highgui -lopencv_imgproc
make trans90と打てばコンパイルができると思います。Makefileは本来は分割ソースのコンパイルに力を発揮しますが、今回のような場合でも十分便利なので利用しました。
それでは今日はこのへんで。
[追記]
Homebrew 0.9.4の環境が入ったMacOS X 10.8.4でも動作の確認ができました。Homebrewの場合CC = gccのように赤字の部分のように書き換えることで、ソースコード(trans90.c)がコンパイル出来ました。ただしOpenCVのバージョンが2.4.5の場合です。指定するディレクトリに注意してください。
CFLAGS = -I/usr/local/Cellar/opencv/2.4.5/include
LDFLAGS = -L/usr/local/Cellar/opencv/2.4.5/lib
LDLIBS = -lm -lopencv_core -lopencv_highgui -lopencv_imgproc
2013年8月7日水曜日
WebカメラとLRFのドッキング
「特定人物の検出」を行うための装置を作りました。
写真を見ていただければわかるかと思いますが、LRFセンサで測定物との距離を測定すると同時に、3台のWebカメラの情報を読み取ることにより、特定人物の検出を行うための装置です。
カメラは真ん中が固定、両サイドは任意角を取れる(手動)ように設計しています。
課題は、測定物の距離により、カメラの角度を変えなければならない(自動)という事です 。
これについては、プログラムがもう少し形になってから考えることにしますが、いずれ改良していかなければならない点だと考えています。
また、このカメラは写真ではすべて縦型で使用していますが、元々は横型で使うものなので視野角についても要改良であると考えています。
いずれにせよ、とにかく動くプログラムを作ってから考えようと思います。
何か動くプログラムができたら、アップしてきます。
では、今日はこのへんで ( 'A' )ノシ
2013年8月6日火曜日
2013年7月22日月曜日
[訂正]OpenCVを使った緯度経度のGoogleMap上へのプロット
前回
OpenCVを使った緯度経度のGoogleMap上へのプロット
で紹介した「2.やり方」よりもっといいやり方があることに気づいたので、投稿しておきます。
前回のやり方では
A. 緯度経度座標をメルカトル座標に変換する
B. 取得した地図の中心点と表示させたい点の距離を測って表示する
というやり方をとっていましたが、このやり方だと
緯度経度座標を直接ピクセル座標(距離情報)に直接変換できない
つまり、逆変換する時とか、色々めんどくさい仕様になっている
という事に気が付きました。
そこで、緯度経度座標を直接ピクセル座標に変換できる方法を以下のサイト様を参考に(丸パクリ)させて頂き、作ってみました。
参考にさせて頂いたサイト様↓ 本当に感謝です!ありがとうございます!!!!m(_ _)m
グーグルマップ(Google Maps) の座標間変換式について(1)
という事で、c言語で書いた変換式を載せておきます。
上のサイトを読まないとよくわからないと思うのでしっかり読んでからご覧ください。
構造体!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
必要なinclude, define!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
コードが見えづらいと思いますので、一応スクショも貼っときます。
以上です。
必要ないことも若干書いてあるので、読みづらいと思いますが、ご勘弁ください。
次は、OpenCVを使って、Googleより取得した地図をくっつけて巨大な地図を作り、その地図の任意の点をクリックするとその点の緯度経度情報を.datファイルに出力するプログラムを作りたいと思います。
それではまた ! ('A')ノシ
OpenCVを使った緯度経度のGoogleMap上へのプロット
で紹介した「2.やり方」よりもっといいやり方があることに気づいたので、投稿しておきます。
前回のやり方では
A. 緯度経度座標をメルカトル座標に変換する
B. 取得した地図の中心点と表示させたい点の距離を測って表示する
というやり方をとっていましたが、このやり方だと
緯度経度座標を直接ピクセル座標(距離情報)に直接変換できない
つまり、逆変換する時とか、色々めんどくさい仕様になっている
という事に気が付きました。
そこで、緯度経度座標を直接ピクセル座標に変換できる方法を以下のサイト様を参考に(丸パクリ)させて頂き、作ってみました。
参考にさせて頂いたサイト様↓ 本当に感謝です!ありがとうございます!!!!m(_ _)m
グーグルマップ(Google Maps) の座標間変換式について(1)
という事で、c言語で書いた変換式を載せておきます。
上のサイトを読まないとよくわからないと思うのでしっかり読んでからご覧ください。
/*========================================================================================
Name : real_frame_to_pix_frame
Argument : point_data *data : 変換するデータ(緯度経度→ピクセル)
int zoom : 地図のズームレベル
Return : no return
About : 緯度経度座標をピクセル座標に変換する
ポインタにより、データを直接いじるので注意すること
========================================================================================*/
void real_frame_to_pix_frame(point_data *data, int zoom)
{
(*data).lo = pow(2,7+zoom) * ((*data).lo/180 + 1);
(*data).la = pow(2,7+zoom)/PI * (-atanh(sin(PI*(*data).la/180)) + atanh(sin(PI*MAX_LA/180)));
}
/*=======================================================================================
Name : pix_frame_to_real_frame
Argument : point_data *data : 変換するデータ(ピクセル→緯度経度)
int zoom : 地図のズームレベル
Return : no return
About : ピクセル座標を緯度経度座標に変換する
ポインタにより、データを直接いじるので注すること
========================================================================================*/
void pix_frame_to_real_frame(point_data *data, int zoom)
{
(*data).lo = 180 * ((*data).lo/pow(2,7+zoom) - 1);
(*data).la = 180/PI * (asin(tanh(-PI*(*data).la/pow(2,7+zoom) + atanh(sin(PI*MAX_LA/180)))));
}
/*=======================================================================================
Name : real_frame_to_picture_frame
Argument : point_data center : 表示する画像の中心緯度経度座標
point_data data : 目標点の緯度経度座標
int zoom : 地図のズームレベル
Return : no return
About : 緯度経度座標を画像座標に変換し、
CvPoint型 picture_frame に格納する
=========================================================================================*/
void real_frame_to_picture_frame(point_data center, point_data data, int zoom)
{
picture_frame.x = pow(2,7+zoom) * ((data.lo-center.lo)/180);
picture_frame.y = pow(2,7+zoom)/PI * (-atanh(sin(PI*center.la/180)) + atanh(sin(PI*data.la/180)));
}
/*========================================================================================
Name : picture_frame_to_real_frame
Argument : point_data center : 表示する画像の中心緯度経度座標
CvPoint data : 目標点の画像座標
int zoom : 地図のズームレベル
Return : no return
About : 画像座標を緯度経度座標に変換し、
point_data型 gps に格納する
========================================================================================*/
void picture_frame_to_real_frame(point_data center, CvPoint2D32f data, int zoom)
{
gps.lo = 180*data.x/pow(2,7+zoom) + center.lo;
gps.la = 180/PI * asin(tanh(PI*data.y/pow(2,7+zoom) + atanh(sin(PI*center.la/180))));
}
構造体!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
typedef struct {
double la; // la is latitude. 緯度
double lo; // lo is longitude. 経度
} point_data;
struct CvPoint{
int x;
int y;
}
struct CvPoint2D32f{
float x;
float y;
}
必要なinclude, define!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#include#include #include
コードが見えづらいと思いますので、一応スクショも貼っときます。
以上です。
必要ないことも若干書いてあるので、読みづらいと思いますが、ご勘弁ください。
次は、OpenCVを使って、Googleより取得した地図をくっつけて巨大な地図を作り、その地図の任意の点をクリックするとその点の緯度経度情報を.datファイルに出力するプログラムを作りたいと思います。
それではまた ! ('A')ノシ
2013年7月4日木曜日
OpenCVを使った画像認識による人検出、色検出
今日は(OpenCVを使った)画像認識による人検出、色検出を試してみました。
考え方としては、Webcamからキャプチャした画像(!)を、いわゆるクロマキー合成に似た手順で、指定した色領域のみ切り出し、
更にその処理済みの画像をHaar-likeフィルタで人検出をして矩形領域で確認する
といった感じです。ただ、この方法だとWebcamのキャプチャを1枚1枚取ることになったり、
それをさらに重いHaar-like処理にかけたりするためかなりリソースを食ってしまうのが困りものです。
というか、リアルタイムで処理するのはほぼ不可能に近いレベルです。どうにかして軽く出来ないかと悩んでいます。(i7を積んでいるのにCPUを4割食う)
ハードウェア的にはスイッチや配線類のゴチャゴチャした部分をどうにかしてまとめようと奮闘中です。
将来的にはスイッチ類やモニタ、配線まですべてまとめてシートの下に入れてしまい、人が乗れるようにする
というのが理想ですが……理想です。できたらいいな……
それは置いといて、とりあえず、配線はずいぶんすっきりしました。
プラプラしてたスイッチも一列にまとまってわかりやすくなっています。
こういうの
http://www2.elecom.co.jp/cable/accessory/spiral-tube/index.asp
で配線をクルクルしてまとめる作業は楽しいです。
それでは。
考え方としては、Webcamからキャプチャした画像(!)を、いわゆるクロマキー合成に似た手順で、指定した色領域のみ切り出し、
更にその処理済みの画像をHaar-likeフィルタで人検出をして矩形領域で確認する
といった感じです。ただ、この方法だとWebcamのキャプチャを1枚1枚取ることになったり、
それをさらに重いHaar-like処理にかけたりするためかなりリソースを食ってしまうのが困りものです。
というか、リアルタイムで処理するのはほぼ不可能に近いレベルです。どうにかして軽く出来ないかと悩んでいます。(i7を積んでいるのにCPUを4割食う)
ハードウェア的にはスイッチや配線類のゴチャゴチャした部分をどうにかしてまとめようと奮闘中です。
将来的にはスイッチ類やモニタ、配線まですべてまとめてシートの下に入れてしまい、人が乗れるようにする
というのが理想ですが……理想です。できたらいいな……
それは置いといて、とりあえず、配線はずいぶんすっきりしました。
プラプラしてたスイッチも一列にまとまってわかりやすくなっています。
こういうの
http://www2.elecom.co.jp/cable/accessory/spiral-tube/index.asp
で配線をクルクルしてまとめる作業は楽しいです。
それでは。
2013年7月3日水曜日
雨雨雨
こんばんは。
ところで、キャンパスは北九州にあるのですが、今日は観測史上最大の大雨が降ったそうで、リバーウォークが真のリバーになったとか、ならなかったとか。
最近は天気に恵まれず、外での実験もできず捗らないです。
今日はロボットがバックできないという致命的な不具合を抱えてしまっていたので、コントローラをiMCs01に変更しました。
コンピュータにインタフェイス社のPCを使っているため、OSが特別にカスタマイズされたものです。なので提供されているドライバがそのままは使えなかったので少しだけソースコードをホゲホゲして使っています。
結果的にバックもできるようになったのでメデタシメデタシ。
それではまたー。
ところで、キャンパスは北九州にあるのですが、今日は観測史上最大の大雨が降ったそうで、リバーウォークが真のリバーになったとか、ならなかったとか。
最近は天気に恵まれず、外での実験もできず捗らないです。
今日はロボットがバックできないという致命的な不具合を抱えてしまっていたので、コントローラをiMCs01に変更しました。
コンピュータにインタフェイス社のPCを使っているため、OSが特別にカスタマイズされたものです。なので提供されているドライバがそのままは使えなかったので少しだけソースコードをホゲホゲして使っています。
結果的にバックもできるようになったのでメデタシメデタシ。
それではまたー。
登録:
投稿 (Atom)




