さて,昨日まではOpenGLでペンタブの入力を取得する方法について書いていたのだが,作りたいアプリの構成を考えるとOpenCV使ったほうが楽そうなので,OpenCVでも同様にbbTabletでペンタブ情報を取得してみた.

とりあえずglutのときと同じようにリンクしてコンパイルしてみると,盛大にエラーが出る.どうやらOpenCVのlibとbbTabletのlibが衝突しているらしい.ので,リンカの設定で「特定の規定のライブラリの無視」にLIBCMTDとmsvcprtdを追加すると,警告は出るものの,コンパイルは通る.

リンカの設定

で,位置と筆圧をゲットして線を引くだけのコードを書いてみた.

#include "bbtablet.h"
#include "opencv2\\opencv.hpp"

#pragma comment(lib, "bbtabletds_vc10.lib")
#pragma comment(lib, "C:\\OpenCV2.2\\lib\\opencv_core220d.lib")
#pragma comment(lib, "C:\\OpenCV2.2\\lib\\opencv_highgui220d.lib")

using namespace cv;

#define WINDOW_NAME		"Tablet Test for OpenCV"
#define PEN_SIZE		20
#define TOUCH_THRESHOLD 0.1

int main(int argc, char *argv[])
{
	//ウィンドウ生成
	namedWindow(WINDOW_NAME, 1);

	//タブレットの初期化
	bbTabletEvent	tabletEvent;
	bbTabletDevice	&td = bbTabletDevice::getInstance( );
	HWND			hWnd = FindWindow(NULL, WINDOW_NAME);
	td.initTablet(hWnd, bbTabletDevice::SEPARATE_POINTER );

	//画像生成
	Mat image(480, 640, CV_8UC3, Scalar(255, 255, 255));

	Point pen, pen_prev;

	//メインループ
	while(1){
		while(td.getNextEvent(tabletEvent)){
			pen_prev = pen;
			pen.x = tabletEvent.getWinX();
			pen.y = tabletEvent.getWinY();
			float p = tabletEvent.pressure;
			if(p > TOUCH_THRESHOLD){
				line(image, pen_prev, pen, Scalar(0,0,0), (int)(PEN_SIZE*p), 8, 0);
			}
		}

		//ウィンドウに表示
		imshow(WINDOW_NAME, image);

		//Escキーで終了
		if(waitKey(1) == 27)break;
	}

	return 0;
}

実行結果はこんな感じ.

息子

結構綺麗に描けるもんだ.曲線補完とかアンチエイリアスとか掛けたくなるね.

 

 

 

前回コンパイルしたlibファイルはVC10用なのでbbtabletds_vc90.lib を勝手にbbtabletds_vc10.libに名前変更.

glutのプロジェクトフォルダにlibファイルとヘッダファイル(bbtablet.h)をコピーする.

で,以下のようにインクルード.

#include <windows.h>
#include <stdio.h>
#include <gl/glut.h>
#include "bbtablet.h"
#pragma comment(lib, "bbtabletds_vc10.lib")

あとは,bbTabletのホームページに書いてある通りに,ウィンドウハンドルを取得して,reshapeコールバック関数あたりで適当に初期化して,idleコールバック関数で適当に呼び出して使う.とても簡単.

HWND getCurrentHWND()
{
	HDC gldc = wglGetCurrentDC();
	HWND win = WindowFromDC(gldc);
	return win;
}

static void reshape(int w, int h)
{
	glViewport(0, 0, w, h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(40.0, (double)w/h, 0.1, 100.0);

	static bool firstTime=true;
	if (firstTime) {
		void *wnd = getCurrentHWND();
		bbTabletDevice &td = bbTabletDevice::getInstance( );
		td = bbTabletDevice::getInstance();
		td.initTablet( wnd, bbTabletDevice::SEPARATE_POINTER );
		firstTime = false;
	}
}

static void idle(void)
{
	static bbTabletEvent evt;
	bbTabletDevice &td = bbTabletDevice::getInstance();
	while (td.getNextEvent(evt)){
		printf("x:%d, y%d:, p:%f\n", evt.getWinX(), evt.getWinY(), evt.pressure);
	}

	glutPostRedisplay();
}

描画までやろうかと思ったけど,ちょっと方針転換するのでここでおしまい.

以下次回.

 

 

 

一度ペンタブを使ったアプリを作りたかったので作るよ.

アプリの詳細は追々.

まずはVC++2010,OpenGLでペンタブの入力を使うための覚書.

 

C++でペンタブレットの入力を扱うには,WinTabというSDKを使う.

しかし,WinTabは公開終了しているらしい.でも大丈夫.問題ない.

WinTabのdll自体はwacomのタブレットドライバから入手可能.

Wacomの開発者向けページのサンプルプログラムに必要なヘッダファイルがあるのでそこから

WINTAB.h,MSGPACK.h,PKTDEF.h を入手する.

 

Win32アプリだったらこのサンプルをゴニョゴニョして作ればいいんだけれど,glutで簡単に使いたい.

調べたらbbTabletというライブラリを発見.

ヘッダファイルをインクルードしてライブラリファイルリンクするだけでglutで使えるらしい.

bbtablet-2009-01-07.zip Source + precompiled libs というのをダウンロードして解凍.

libファイルがvc9用までしかなかったのでコンパイルしてみる.

[展開したフォルダ]\bbtablet\MSVC\bbtablet_vc9.sln を開いてVS2010用に変換.

ビルドするとwintab.hがないとか言われるので,

[展開したフォルダ]\bbtablet\include

にさっきゲットした WINTAB.h,MSGPACK.h,PKTDEF.h をコピー.

これでbbtablet_vc9というプロジェクトはビルドできる.

他のglのサンプルはまだコンパイルが通らないが,ライブラリファイルさえゲット出来ればいいので放置.

[展開したフォルダ]\bbtablet\lib

の bbtabletds_vc90.lib というファイルがVC10用になったはず.

あとは自前のプロジェクトに突っ込めば動く.詳細は次回.

 

 

 

© 2014 Saikoro Laboratory Blog Suffusion theme by Sayontan Sinha