アーカイブ
‘Teleshadow’ タグのついている投稿
輪郭で表示
2009 年 8 月 27 日
コメントはありません
アメリカ出張中に、こういう輪郭だけの表示もありかなと思って作ってみたけどまだ実機で試してないからわからないんだった
そのうちやる。

■ダウンロ〜ド
■参考
この2つを合体させた。
■boostでprintf風の文字列フォーマット
boost::formatを使う。
#include <boost/format.hpp>
using namespace std;
using namespace boost;
const int INIT_TIME = 50;
cout << str(format("輝度平均 %d/%d") % i % INIT_TIME) << endl;
■ソースコード
bgsubavg-contour/image.cpp
#include <cv.h>
#include <highgui.h>
#include <ctype.h>
#include <stdio.h>
#include <iostream>
#include <boost/format.hpp>
using namespace std;
using namespace boost;
int main(int argc, char **argv)
{
const int INIT_TIME = 50;
const double BG_RATIO = 0.02; // 背景領域更新レート
const double OBJ_RATIO = 0.005; // 物体領域更新レート
const double Zeta = 10.0;
IplImage *img = NULL;
CvMemStorage* storage_contour = cvCreateMemStorage(0);
CvSeq* find_contour = NULL;
CvCapture *capture = NULL;
capture = cvCreateCameraCapture(0);
//capture = cvCaptureFromAVI("test.avi");
if(capture == NULL){
cerr << "capture device not found!!" << endl;
return -1;
}
img = cvQueryFrame(capture);
CvSize size = cvSize(img->width, img->height);
IplImage *imgAverage = cvCreateImage(size, IPL_DEPTH_32F, 3);
IplImage *imgSgm = cvCreateImage(size, IPL_DEPTH_32F, 3);
IplImage *imgTmp = cvCreateImage(size, IPL_DEPTH_32F, 3);
IplImage *img_lower = cvCreateImage(size, IPL_DEPTH_32F, 3);
IplImage *img_upper = cvCreateImage(size, IPL_DEPTH_32F, 3);
IplImage *imgSilhouette = cvCreateImage(size, IPL_DEPTH_8U, 1);
IplImage *imgSilhouetteInv = cvCreateImage(size, IPL_DEPTH_8U, 1);
IplImage *imgResult = cvCreateImage(size, IPL_DEPTH_8U, 1);
IplImage *imgContour = cvCreateImage(size, IPL_DEPTH_8U, 1);
IplImage *imgSilhouette_p = cvCreateImage(size, IPL_DEPTH_8U, 1);
cout << "背景初期化中..." << endl;
cvSetZero(imgAverage);
for(int i = 0; i < INIT_TIME; i++){
img = cvQueryFrame(capture);
cvAcc(img, imgAverage);
cout << str(format("輝度平均 %d/%d") % i % INIT_TIME) << endl;
}
cvConvertScale(imgAverage, imgAverage, 1.0 / INIT_TIME);
cvSetZero(imgSgm);
for(int i = 0; i < INIT_TIME; i++){
img = cvQueryFrame(capture);
cvConvert(img, imgTmp);
cvSub(imgTmp, imgAverage, imgTmp);
cvPow(imgTmp, imgTmp, 2.0);
cvConvertScale(imgTmp, imgTmp, 2.0);
cvPow(imgTmp, imgTmp, 0.5);
cvAcc(imgTmp, imgSgm);
cout << str(format("輝度振幅 %d/%d") % i % INIT_TIME) << endl;
}
cvConvertScale(imgSgm, imgSgm, 1.0 / INIT_TIME);
cout << "背景初期化完了" << endl;
char winNameCapture[] = "Capture";
char winNameSilhouette[] = "Silhouette";
char winNameContour[] = "Contour";
cvNamedWindow(winNameCapture, CV_WINDOW_AUTOSIZE);
cvNamedWindow(winNameSilhouette, CV_WINDOW_AUTOSIZE);
cvNamedWindow(winNameContour, CV_WINDOW_AUTOSIZE);
bool isStop = false;
while(1){
if(!isStop){
img = cvQueryFrame(capture);
if(img == NULL) break;
cvConvert(img, imgTmp);
// 輝度範囲
cvSub(imgAverage, imgSgm, img_lower);
cvSubS(img_lower, cvScalarAll(Zeta), img_lower);
cvAdd(imgAverage, imgSgm, img_upper);
cvAddS(img_upper, cvScalarAll(Zeta), img_upper);
cvInRange(imgTmp, img_lower, img_upper, imgSilhouette);
// 輝度振幅
cvSub(imgTmp, imgAverage, imgTmp);
cvPow(imgTmp, imgTmp, 2.0);
cvConvertScale(imgTmp, imgTmp, 2.0);
cvPow(imgTmp, imgTmp, 0.5);
// 背景領域を更新
cvRunningAvg(img, imgAverage, BG_RATIO, imgSilhouette);
cvRunningAvg(imgTmp, imgSgm, BG_RATIO, imgSilhouette);
// 物体領域を更新
cvNot(imgSilhouette, imgSilhouetteInv);
cvRunningAvg(imgTmp, imgSgm, OBJ_RATIO, imgSilhouetteInv);
cvErode(imgSilhouette, imgSilhouette, NULL, 2); // 収縮
cvDilate(imgSilhouette, imgSilhouette, NULL, 4); // 膨張
cvErode(imgSilhouette, imgSilhouette, NULL, 2); // 収縮
cvAnd(imgSilhouette, imgSilhouette_p, imgResult);
// 輪郭抽出、青線で囲む
int contour_num = cvFindContours(cvCloneImage(imgResult), storage_contour, &find_contour,
sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_NONE,
cvPoint(0,0));
CvScalar white = CV_RGB(255,255,255);
cvSetZero(imgContour);
cvDrawContours(imgContour, find_contour, white, white, 2, 2, 8, cvPoint(0,0));
cvNot(imgContour, imgContour);
cvShowImage(winNameCapture, img);
cvShowImage(winNameSilhouette, imgResult);
cvShowImage(winNameContour, imgContour);
cvCopy(imgSilhouette, imgSilhouette_p);
}
int waitKey = cvWaitKey(33);
if(waitKey == 'q') break;
if(waitKey == ' '){
isStop = !isStop;
if(isStop) cout << "stop" << endl;
else cout << "start" << endl;
}
}
cvReleaseCapture(&capture);
cvDestroyWindow(winNameCapture);
cvDestroyWindow(winNameSilhouette);
cvDestroyWindow(winNameContour);
return 0;
}
Makefile
SRC = image.cpp
DST = image
prefix=/opt/local
INCPATH=$(prefix)/include
LIBPATH=$(prefix)/lib
OPT= -lcv -lcvaux -lcxcore -lhighgui
CC=g++ -O
CFLAGS= -I$(INCPATH)/opencv
LDFLAGS=-L. -L$(LIBPATH)
all:
$(CC) $(SRC) -o $(DST) $(CFLAGS) $(LDFLAGS) $(OPT)
Make Tokyo Meeting 03に出展します
2009 年 5 月 18 日
コメントはありません
Make: Tokyo Meeting03に個人的に出展します
開催日:2009年5月23日(土)、24日(日)
時間:23日 12:00 – 18:00、24日 10:00 – 17:00
入場:無料
会場:デジタルハリウッド 八王子制作スタジオ
東京都八王子市松が谷1番地 – Google Maps
交通:多摩都市モノレール「松が谷駅」徒歩1分
京王線・小田急線「多摩センター駅」徒歩10分
主催:株式会社オライリー・ジャパン 共催:多摩美術大学 情報デザイン学科
協力:デジタルハリウッド大学、東京工芸大学 メディアアート表現学科
■出展情報
- ブース名:橋本商会
- 展示日:5/24(日)(2日目のみ、1日目が修論中間発表のため)
- ブースの場所:まだわからない
■展示物
2つです
- USB Force Field : 静電気容量を使ったセンサーキット、若干数販売あり
- 影電話 : ずっと作ってるやつ、うまい具合に暗かったら展示できたらする
■USBフォースフィールド
大変うさんくさく見えるけど、PSoC CapSenseで静電容量タッチセンサ 4つ動かしたの進化形で5cm程度の距離で反応するようになりました
(動画)
これをUSBデバイス化していくつか売ろうと思いますが需要がわからない。あまり作らないと思います
どれぐらい作ればいいんだろう。1つ3000円ぐらいになりそう。
もちろんアンテナ部分の形状を変えれば、前述のタッチセンサとしても使えるようになってます。
■影電話
これが今2台あって通信するようになってるんだけど、どうやって置いておこうかなあと考えている
(動画)
USBコネクタの埋め込み
2009 年 4 月 10 日
コメントはありません
電源コネクタに続き、筐体へのUSBコネクタ ミニB型の埋め込み。

ミニピンコネクタは秋葉原で売っているけど、細かすぎてはんだづけ不可能なので市販のケーブルを使う。
ケーブルダイレクト USB2.0ケーブル ミニBコネクタ メス−ミニBコネクタ オス<ミニB延長用> 長さ0.9m USB2-MBMF-03
posted with amazlet at 09.04.10
株式会社ネットメカニズム
売り上げランキング: 10935
売り上げランキング: 10935
おすすめ度の平均: 

唯一のUSB-ミニBオスメス変換コード長いので切る

同じ色同士ではんだづけする


このままではショートするので、グルーガンで包む

コネクタ側にドレメルの回転カッターで切り込みを入れる

銅板を切ってネジ穴を開けておく

壁面に差し込んで

さっき入れた切り込みを利用して固定する。これで動かなくなる

できた!
頭身を低く、足を細くしてみた
2009 年 4 月 7 日
コメントはありません
暗い所でも背景差分できる
2009 年 4 月 1 日
コメントはありません
プログラムはこれ
OpenCV Study: 5af15ced343f BgSubAvg/bgsubAvg.cpp

ノシ ノシ できる
ハードをもう一つ作るぞ
(エイプリルフールだけどコラではないです)







最近のコメント