現在地 >> メニュー >> サンプルコード::OpenCV >> OpenCV::アルファブレンド2

問題


ウィンドウを2つ作成し、それぞれにらくがきして、
二つの色を混ぜた結果を表示せよ。

答え


#include <iostream>
#include <cv.h>
#include <highgui.h>

using namespace std;


/********* プロトタイプ宣言 **************/
void Mouse1( int event, int x, int y, int flags ,void *param);
void Mouse2(int event, int x, int y, int flags ,void *param);



IplImage *CV_ALPHA_BREND(IplImage *imgA,IplImage *imgB, double alpha = 0.5);


/************* メイン関数 ********************/
int main( int argc, char **argv)
{

static CvSize window_size={300,300};
IplImage *imgA = cvCreateImage(window_size,IPL_DEPTH_8U,3);
cvSet (imgA, cvScalarAll (255), 0);

IplImage *imgB = cvCloneImage(imgA);


cvNamedWindow("window",CV_WINDOW_AUTOSIZE);
cvShowImage("window",imgA);

cvNamedWindow("window2",CV_WINDOW_AUTOSIZE);
cvShowImage("window2",imgB);


cvSetMouseCallback("window", Mouse1,imgA);
cvSetMouseCallback("window2", Mouse2,imgB);

cvWaitKey(0); // 0秒待つ => ずっと入力待ち
cvDestroyAllWindows();


IplImage *alpha = CV_ALPHA_BREND(imgA,imgB,0.5);


cvNamedWindow("mix",CV_WINDOW_AUTOSIZE);
cvShowImage("mix",alpha);


cvReleaseImage(& imgA);
cvReleaseImage(& imgB);

cvWaitKey(0);


cvReleaseImage(& alpha);

cvDestroyAllWindows();


return 0;
}




/****************** [ここから コールバック]***************/
/******** マウス処理1 ***********/
int Xstart,Ystart;
int xdis,ydis;
void Mouse1( int event, int x, int y, int flags ,void *imgA) // コールバック関数
{
static bool MOUSE_FLAG=false;

switch(event)
{

case CV_EVENT_LBUTTONDOWN:
MOUSE_FLAG = true;
Xstart = x;
Ystart = y;
cvRectangle((IplImage*)imgA,cvPoint(x,y),cvPoint(x,y),cvScalar(255,0,0),5);
cvShowImage("window",(IplImage*)imgA);
break;

case CV_EVENT_LBUTTONUP:
MOUSE_FLAG=false;
break;

}

if(event == CV_EVENT_MOUSEMOVE && MOUSE_FLAG == true)
{
xdis = abs(x - Xstart);
ydis = abs(y - Ystart);

if(xdis > 1 || ydis > 1)
{
cvLine((IplImage*)imgA,cvPoint(x,y),cvPoint(Xstart,Ystart),cvScalar(255,0,0),5);
}else
{
cvRectangle((IplImage*)imgA,cvPoint(x,y),cvPoint(x,y),cvScalar(255,0,0),5);
}

cvShowImage("window",(IplImage*)imgA);

Xstart = x;
Ystart = y;

}

}


/********** マウス処理2 *************/
int Xstart2,Ystart2;
int xdis2,ydis2;
void Mouse2( int event, int x, int y, int flags ,void *imgA) // コールバック関数
{
static bool MOUSE_FLAG=false;

switch(event)
{

case CV_EVENT_LBUTTONDOWN:
MOUSE_FLAG = true;
Xstart2 = x;
Ystart2 = y;
cvRectangle((IplImage*)imgA,cvPoint(x,y),cvPoint(x,y),cvScalar(0,0,255),5);
cvShowImage("window2",(IplImage*)imgA);
break;

case CV_EVENT_LBUTTONUP:
MOUSE_FLAG=false;
break;

}

if(event == CV_EVENT_MOUSEMOVE && MOUSE_FLAG == true)
{
xdis2 = abs(x - Xstart2);
ydis2 = abs(y - Ystart2);

if(xdis2 > 1 || ydis2 > 1)
{
cvLine((IplImage*)imgA,cvPoint(x,y),cvPoint(Xstart2,Ystart2),cvScalar(0,0,255),5);
}else
{
cvRectangle((IplImage*)imgA,cvPoint(x,y),cvPoint(x,y),cvScalar(0,0,255),5);
}

cvShowImage("window2",(IplImage*)imgA);

Xstart2 = x;
Ystart2 = y;

}

}



IplImage *CV_ALPHA_BREND(IplImage *imgA,IplImage *imgB,double alpha)
{

unsigned int data_it;
IplImage *temp=cvCloneImage(imgA);

for(int j = 0;j<imgA->height;j++)
{
for(int i = 0;i<imgA->widthStep;i+=3)
{
data_it = j*temp->widthStep + i;

if((temp->imageData[data_it] == char(255) )&&
(temp->imageData[data_it+1] == char(255) )&&
(temp->imageData[data_it+2] == char(255))
)
{

temp->imageData[data_it] = imgB->imageData[data_it];
temp->imageData[data_it+1] = imgB->imageData[data_it+1];
temp->imageData[data_it+2] = imgB->imageData[data_it+2];
}
else{

if(!( (imgB->imageData[data_it] == char(255) ) &&
(imgB->imageData[data_it+1] == char(255) )&&
(imgB->imageData[data_it+2] == char(255)))
)
{
temp->imageData[data_it] = char(alpha * unsigned char (imgA->imageData[data_it]) + (1.0-alpha) * unsigned char (imgB->imageData[data_it]));
temp->imageData[data_it+1] = char(alpha * unsigned char (imgA->imageData[data_it + 1]) + (1.0-alpha) * unsigned char (imgB->imageData[data_it + 1]));
temp->imageData[data_it+2] = char(alpha * unsigned char (imgA->imageData[data_it + 2]) + (1.0-alpha) * unsigned char (imgB->imageData[data_it + 2]));
}


}

}
}

return (temp);
}
×

この広告は60日間更新がないwikiに表示されております。

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






▲よろしければ広告のクリックもお願いします


▲ランキングに参加しました

管理人/副管理人のみ編集できます