最終更新: mikk_ni3_92 2008年05月30日(金) 15:09:27履歴
現在地 >> メニュー >> サンプルコード::OpenCV >> OpenCV::アルファブレンド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);
}
#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);
}