Life, Education, Death

プログラミング以外でも思ったことをつらつらと書きたい

アルファブレンドをする

いくつかまとめているところがあったので、これを読めば実装はできる。

今度他の実装をするかもしれないので、リンクをメモしとく。

最適化について

SSEとか使っていくと、どんどん早くなる模様。並列化もできるコードなのでboostを使って、配列を分割して処理したら早いんじゃないかなと思ってるが、まだ試していない。
http://gir-lab.spaces.live.com/Blog/cns!63A4C32EDA5CF2F7!763.entry
http://ray.sakura.ne.jp/asm/link.html

OpenCVでやってみる

IplImage *srcImg = cvLoadImage( "test1.jpg" );
IplImage *targetImg = cvLoadImage( "test2.jpg" );
IplImage *maskImg = cvLoadImage( "mask.jpg" );
unsigned long length = srcImg->height * srcImg->widthStep;
for( unsigned long i=0; i<length; ++i ){
	resultImg->imageData[i] = ((unsigned char)srcImg->imageData[i]*(255-maskImg->imageData[i]) + (unsigned char)targetImg->imageData[i]*(unsigned char)maskImg->imageData[i])/255;
}

こんな感じに実際やってみた。わざと3チャンネルのマスクにしておいて、特定の色だけ抜くとかできるようにやっている。

こんな短いコードなのにすごく何時間も無駄にしていて、OpenCVのimageDataはcharの配列なので、unsigned charにしてやらないと負の値の色のときに計算ができなくなり(半分の色で)おかしな結果が出てしまう。

こういう計算をするときはちゃんとキャストとかも気をつけないといけないんだなと教訓を得た。


cppなのでstatic_castで書くべきか悩んであげく、面倒でやってないというのは気にしない方向で。