講義情報botをつくった!
https://twitter.com/HUeng_lecinfo
講義情報botは前々から作りたかったんだけど
スクレイピングめんどいからやってなかったんだよねー
だけどkimonoっていうサービスをつかえば一発なんだねー。
kimono : Turn websites into structured APIs from your browser in seconds
サイコーだね!
今回GAEで動かしてるんだけど
GAEでのcronの書き方
every 30 minutes
って書くとGAELauncherからデプロイした時刻から毎時30分とか半端な時間で実行されてしまって結構こまっていたのだが
GoogleAppEngineでの、Cronの書き方でハマった | Walk on apps.
これ見て
every 30 minutes from 0:00 to 23:59
って書いたら解決した!
ブログちゃんと書くのめんどいからテキトーでsu
久々にブログを更新してみる
春休みもほぼ終わりですね
最近はProcessingであそんだり
なんか曲つくったり
してましたね。
そんで!!!!
3/14 にはモグモール
モグモール -秋葉原MOGRA札幌支店mole出張所- - TwiPla
行ってきましたよ!!!
moleは何回か行った事あったけどクラブって怖いイメージしかなくて、あんまり好きでなかったんですが
今回は怖い思いをすることもなく楽しめた!
前の方でオタ芸してるひととか
カオナシがピアニカふいてたりとか
ゴスロリのひととか
客層が怖い人じゃなかったってのが大きかったかもしれないっす
ブッダハウスさんというDJのビートが気持ちよすぎて終始踊り狂ってました!
なんか札幌の人らしいのでこれからもチェックしていきたい。頑張って聞きにいきたい。
あとD-YAMAさん(秋葉原MOGRAの店長)の選曲好きだった
ラストの「朝が来るまで終わる事の無いダンスを」まじサイコーだった
次回は5月だって。絶対行く!!
OpenCV グリッチアート
やっとグリッチアートっぽいものが完成した。
#include "opencv/cv.h" #include "opencv/highgui.h" void Trackbar(int val); IplImage* img; IplImage* originalimg; int main(){ char image[]= "/Users/Daichi/Desktop/lena.jpg"; img = cvLoadImage(image, CV_LOAD_IMAGE_COLOR); originalimg = cvLoadImage(image, CV_LOAD_IMAGE_COLOR); cvNamedWindow ("RGBchanger", CV_WINDOW_AUTOSIZE); cvShowImage ("RGBchanger",img); cvCreateTrackbar("Move it", "RGBchanger", 0, 1000, Trackbar); cvWaitKey (0); cvDestroyWindow("RGBchanger"); cvReleaseImage(&img); return 0; } uchar p[3]; int x,y; void Trackbar(int val){ int val2=val*2; for (y = 0; y < img->height; y++) { for (x = 0; x < img->width; x++) { p[0] = img->imageData[img->widthStep * y + x * 3]; // B p[1] = img->imageData[img->widthStep * y + x * 3 + 1]; // G p[2] = img->imageData[img->widthStep * y + x * 3 + 2]; // R img->imageData[img->widthStep * y + x * 3] = originalimg->imageData[img->widthStep * y + (x+val) * 3]; img->imageData[img->widthStep * y + x * 3 + 1] = originalimg->imageData[img->widthStep * y + (x+val/3) * 3 + 1]; img->imageData[img->widthStep * y + x * 3 + 2] = originalimg->imageData[img->widthStep * y + (x+val/2) * 3 + 2]; } } cvShowImage ("RGBchanger", img); }
#include "opencv/cv.h" #include "opencv/highgui.h" void Trackbar(int val); IplImage* img; IplImage* originalimg; int main(){ char image[]= "/Users/Daichi/Desktop/lena.jpg"; img = cvLoadImage(image, CV_LOAD_IMAGE_COLOR); originalimg = cvLoadImage(image, CV_LOAD_IMAGE_COLOR); cvNamedWindow ("RGBchanger", CV_WINDOW_AUTOSIZE); cvShowImage ("RGBchanger",img); cvCreateTrackbar("Move it", "RGBchanger", 0, 1000, Trackbar); cvWaitKey (0); cvDestroyWindow("RGBchanger"); cvReleaseImage(&img); return 0; } uchar p[3]; int x,y; void Trackbar(int val){ int val2=val*2; for (y = 0; y < img->height; y++) { for (x = 0; x < img->width; x++) { p[0] = img->imageData[img->widthStep * y + x * 3]; // B p[1] = img->imageData[img->widthStep * y + x * 3 + 1]; // G p[2] = img->imageData[img->widthStep * y + x * 3 + 2]; // R img->imageData[img->widthStep * y + x * 3] = originalimg->imageData[img->widthStep * (y-val2) + (x+val) * 3]; img->imageData[img->widthStep * y + x * 3 + 1] = originalimg->imageData[img->widthStep * (y-val2/3) + (x+val/3) * 3 + 1]; img->imageData[img->widthStep * y + x * 3 + 2] = originalimg->imageData[img->widthStep * (y-val2/2) + (x+val/2) * 3 + 2]; } } cvShowImage ("RGBchanger", img); }
OpenCV ピクセル単位でRGBの値を変更
これとか
【OpenCV】IplImageの輝度値を参照、設定する 画像処理ソリューション
これ読んだら
なんとなーくIplImageのデータがどんな風に並べられているかわかった。
ので、
opencv.jp - OpenCV: 基本構造体(Basic Structures)サンプルコード -
これをちょちょっといじって、
トラックバーを触るたびに各ピクセルのRGBを順番に入れ替えるようにしてみた。
#include "opencv/cv.h" #include "opencv/highgui.h" void Trackbar(int val); IplImage* img; //トラックバーの関数から操作するためにグローバル関数に置く int main(){ img = cvLoadImage("/Users/ぼくのなまえ/Desktop/ff.jpg", CV_LOAD_IMAGE_COLOR); cvNamedWindow ("RGBchanger", CV_WINDOW_AUTOSIZE); cvShowImage ("RGBchanger",img); cvCreateTrackbar("Move it", "RGBchanger", 0, 100, Trackbar); cvWaitKey (0); cvDestroyWindow("RGBchanger"); cvReleaseImage(&img); return 0; } uchar p[3]; int x,y; void Trackbar(int val){ for (y = 0; y < img->height; y++) { for (x = 0; x < img->width; x++) { p[0] = img->imageData[img->widthStep * y + x * 3]; // B p[1] = img->imageData[img->widthStep * y + x * 3 + 1]; // G p[2] = img->imageData[img->widthStep * y + x * 3 + 2]; // R img->imageData[img->widthStep * y + x * 3] = p[1]; img->imageData[img->widthStep * y + x * 3 + 1] = p[2]; img->imageData[img->widthStep * y + x * 3 + 2] = p[0]; } } cvShowImage ("RGBchanger", img); }
ビカビカビカビカ
グリッチアートをつくりたいという動機でOpenCVを始めたわけですが、The Wordpad Glith と呼ばれるバイナリデータの文字置き換えによる手法
←これ
は、jpgとかpngとかの圧縮画像データだからなるわけで、OpenCVの中ではできないんじゃね?メモ帳使った方が早いんじゃね?
OpenCV 顔認識(Cで)
この前の顔認識のサンプルはopencv2で書かれていたようなので、
今回はopencv1(と言って良いのかな?)でサンプルも参考にしつつ自分で書いてみた。
opencv2をつかわなければCだけでいけるみたい。
#include "opencv/cv.h" #include "opencv/highgui.h" int main(){ /*画像読み込み グレースケール作成*/ IplImage* img; img = cvLoadImage("/Users/ユーザ名/Desktop/akb48.jpeg", CV_LOAD_IMAGE_COLOR); IplImage* gray; gray= cvCreateImage (cvGetSize (img), IPL_DEPTH_8U, 1); cvCvtColor (img, gray, CV_BGR2GRAY); cvEqualizeHist (gray, gray); /*分類器のカスケードを読み込み*/ CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade *) cvLoad ("/opt/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml", 0, 0, 0); /*メモリの確保*/ CvMemStorage *storage = 0; storage = cvCreateMemStorage (0); cvClearMemStorage (storage); /*顔の検出*/ CvSeq *faces; faces = cvHaarDetectObjects (gray, cascade, storage, 1.11, 4, 0); /*顔の位置に矩形を描画*/ int i; CvScalar colors[] = { {{0, 0, 255}}, {{0, 128, 255}}, {{0, 255, 255}}, {{0, 255, 0}}, {{255, 128, 0}}, {{255, 255, 0}}, {{255, 0, 0}}, {{255, 0, 255}} }; for (i = 0; i < (faces ? faces->total : 0); i++) { CvRect *r = (CvRect *) cvGetSeqElem (faces, i); cvRectangle(img, cvPoint(r->x,r->y), cvPoint(r->x+r->width,r->y+r->height), colors[i%8], 3, CV_AA); } cvNamedWindow ("faces", CV_WINDOW_AUTOSIZE); cvShowImage ("faces",img); cvWaitKey (0); cvDestroyWindow("faces"); cvReleaseImage(&img); cvReleaseImage(&gray); cvReleaseMemStorage (&storage); return 0; }
今回は円じゃなく矩形を描画してみた。
僕特にAKB好きじゃないんですけど、写りがよくて正面向いた顔がいっぱい並んでる写真が欲しいとAKBがお手軽ですね。
OpenCV バイナリデータをいじる
バイナリデータをいじってみた。
OpenCVで、画像のデータはIplImageかcv::Matで扱える。IplImageはCの構造体、cv::MatはC++のクラスらしい!やっぱり前回のサンプルとかも全然意味分かんないので当面はCだけでやっていく。
画像のデータはIplImage構造体の中のchar* imageDataに入っているみたいなのでとりあえずそれを1文字ずつ適当な数字に変えてみる。
#include#include #include "opencv/cv.h" #include "opencv/highgui.h" int main(int argc, char* argv[]){ IplImage* img = cvLoadImage("/Users/Daichi/Desktop/lena.jpg", CV_LOAD_IMAGE_COLOR); int i; for(i=0;i<100000;i++){ printf("%c\n",img->imageData[i]); img->imageData[i] = 2; } cvNamedWindow ("glitch", CV_WINDOW_AUTOSIZE); cvShowImage ("glitch",img); cvWaitKey (0); cvDestroyWindow("glitch"); cvReleaseImage(&img); return 0; }
コレを実行すると.....
変えた部分だけ真っ黒になった。
どうやら
img->imageData[i]=数字;
の数字は0〜255の範囲で有効っぽくて、0に近い程黒くなって、255に近い程白になっていった.
char型は1文字(1ビット)だからか。
これは
img->imageData[i*3]=255;
の設定。それっぽくなってきたぞ。。
imageDataを1文字づつ表示させてみたら
こんな感じ。
\3桁の数字 とアルファベット1文字、とかが混在してるけど、よくわからんなー
一連の動作を関数にまとめたいけど構造体を関数に渡すのが上手くできない!(ポインタ、あやふや)