memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

ofxCvImageのwarpIntoMe()とwarpPerspective()のとあるサンプル

適当なサンプルが転がっていなかったので参考まで。

-ofApp.h

#pragma once

#include "ofMain.h"
#include "ofxOpenCv.h"

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);
    
    ofVideoGrabber vidGrabber;
    ofxCvColorImage img1;
    ofxCvColorImage img2;
    ofPoint srcPoints[4];
    ofPoint destPoints[4];
};

-ofApp.cpp

#include "ofApp.h"

//--------------------------------------------------------------
void ofApp::setup(){
//    ofSetLogLevel(OF_LOG_VERBOSE);
//    ofSetFrameRate(60);
//    ofSetVerticalSync(true);
    vidGrabber.setDeviceID(1); //★
//    vidGrabber.setVerbose(true);
//    vidGrabber.listDevices();
    vidGrabber.initGrabber(320 ,240);
    img1.allocate(320 ,240);
    img2.allocate(320 ,240);
    
    srcPoints[0] = ofPoint(0,0);
    srcPoints[1] = ofPoint(320,0);
    srcPoints[2] = ofPoint(320,240);
    srcPoints[3] = ofPoint(0,240);

    destPoints[0] = ofPoint(20,10);
    destPoints[1] = ofPoint(70,0);
    destPoints[2] = ofPoint(90,120);
    destPoints[3] = ofPoint(20,130);
}

//--------------------------------------------------------------
void ofApp::update(){
    vidGrabber.update();
    if (vidGrabber.isFrameNew()) {
        img1.setFromPixels(vidGrabber.getPixels(), 320, 240);
        img2.warpIntoMe(img1, srcPoints, destPoints);
        img1.warpPerspective(destPoints[0], destPoints[1], destPoints[2], destPoints[3]);
    }
}

//--------------------------------------------------------------
void ofApp::draw(){
    ofSetColor(0xffffff);
    vidGrabber.draw(0, 0);
    img1.draw(0, 240);
    img2.draw(0, 480);
}

//--------------------------------------------------------------
void ofApp::keyPressed(int key){
    
}

//--------------------------------------------------------------
void ofApp::keyReleased(int key){
    
}

//--------------------------------------------------------------
void ofApp::mouseMoved(int x, int y ){

}

//--------------------------------------------------------------
void ofApp::mouseDragged(int x, int y, int button){

}

//--------------------------------------------------------------
void ofApp::mousePressed(int x, int y, int button){

}

//--------------------------------------------------------------
void ofApp::mouseReleased(int x, int y, int button){

}

//--------------------------------------------------------------
void ofApp::windowResized(int w, int h){

}

//--------------------------------------------------------------
void ofApp::gotMessage(ofMessage msg){

}

//--------------------------------------------------------------
void ofApp::dragEvent(ofDragInfo dragInfo){ 

}


■実行結果
一番上がカメラから取得したオリジナル。次がwarpPerspective()、一番下がwarpIntoMe()の結果です。

この結果から類推すると、warpPerspectiveはもと画像の一部を4点で指定した領域で切り取りofxCvColorImageのサイズに変換してくれるようです。恐らく、カメラで斜めから撮影した対象を正面から捉えた画像に変換するときに利用するものと思います。一方、warpIntoMeは変換元と変換先の領域を指定できるためwarpPerspectiveより自由度の高い変換が可能と思われます。

f:id:ke_takahashi:20150707183511p:plain

■余談ですが

カメラ(iSight)からの画像を取り込んで表示するだけのプログラムを作っていたのですが、なかなか現れず苦労しました。。。MBAをとじてCinema Displayに接続して動作確認していたのですが、そのときには上記ソース中の★を入れる必要があります。これをいれないと真っ黒なまま。しかもinitGrabberを実行する前にいれないと効きません。ちなみに以下のようなワーニングがコンソールに表示されているのですが他のログに埋もれてしまい、途方に暮れていたときには気づきませんでした。これもわかってしまえばなんてことはないことなんですけどね。。。

[warning] ofxVideoGrabber: setDeviceID(): can't set device while grabber is running