Edited at

oFとBlackMagic intensityを使ってハンディカムの映像をリアルタイムに取り込んでOpenCVで処理する

More than 3 years have passed since last update.


環境

- MacPro OSX10.10

- BlackMagic Intensity Shuttle

- sony CX-675

- oF 0.8.4


結果


  • できたけどできなかった


やり方

ofVideoGrabberで入れ込んでいた映像をofxBlackmagicにするだけだが、

ofxcvcolorImageに入れ込むとなんでかチャンネル毎に横並び映像になってしまった。。

スリットが入ったような白黒映像のみが映り何が映ってるかわからない状態だったり、フルHDでフルスクリーンで映ってるはずなのに小窓で何個も並んでる状態で映ったりと使えなかった。時間もなくカラー取り込みは諦めたが

ofxcvcolorimageのところをofxcvfloatimageにして読み込んだら白黒だが取り込めた。

あとはそれをつかってhaarをつかって顔認証させていじり倒す。

ofApp.h

#include "ofMain.h"

#include "ofxBlackMagic.h"
#include "ofxOpenCv.h"
#include "ofxCv.h"
#include "ofxCvHaarFinder.h"
#include "ofLog.h"

using namespace ofxCv;
using namespace cv;

#define _USE_LIVE_VIDEO

class ofApp : public ofBaseApp{

public:
void setup();
void update();
void draw();

void keyPressed(int key);
void keyReleased(int key);
void mouseMoved(int x, int y );
void mouseDragged(int x, int y, int button);
void mousePressed(int x, int y, int button);
void mouseReleased(int x, int y, int button);
void windowResized(int w, int h);
void dragEvent(ofDragInfo dragInfo);
void gotMessage(ofMessage msg);

ofxBlackMagic cam;
ofxCvFloatImage faceImg; //ここを普段と変えてカラーからモノクロへ
ofImage incam;
ofxCvGrayscaleImage grayImg;
ofxCvContourFinder contourFinder;
ofxCvHaarFinder haarFinder;
string cascade_path;

ofApp.cpp

void ofApp::setup(){

ofBackground(0, 0, 0);
ofHideCursor();
ofEnableAlphaBlending();
ofSetFullscreen(1);
ofSetFrameRate(0);
ofEnableBlendMode(OF_BLENDMODE_ALPHA);

haarFinder.setup("haarcascade_frontalface_alt_tree.xml");

cam.setup(1920, 1080, 59.94);

// Initialize Flag
isFaceFound = false;
isStarted = false;
faceImg.clear();
threshold = 90;

}

void ofApp::update(){

if(cam.update()){
incam.setFromPixels(cam.getGrayPixels());
faceImg.setFromPixels(incam.getPixels(),1920,1080);
grayImg = faceImg;
grayImg.threshold(threshold);
haarFinder.findHaarObjects(grayImg,0,0,1920, 1080,150,150);
if(haarFinder.blobs.size() > 0){
isFaceFound = true;
}//if(haarFinder.blobs.size() > 0)
}//if(cam.update())
}//if(!isStarted)

if(isFaceFound && !isStarted){
isStarted = true;
ofRectangle cur = haarFinder.blobs[0].boundingRect;
int x = cur.x;
int y = cur.y-15;
int w = cur.width;
int h = cur.height+15;
faceImg.setROI(x, y, w, h);

}//if(isFaceFound && isStarted == false)

こんな感じで白黒では取れるようになった。

カラーでとりこめる方法がわかる方いたら教えて欲しいです。。笑