最終更新: mikk_ni3_92 2008年05月30日(金) 15:19:05履歴
現在地 >> メニュー >> サンプルコード::OpenCV >> OpenCV::アルファブレンド >> OpenCV::アルファ+キー入力
#include <cv.h>
#include <highgui.h>
#include <iostream>
using namespace std;
char *file[]={"file5.jpg","file6.jpg"};
#define IMAGE_NUM 2
/**** 各種プロトタイプ宣言 ****/
inline void CV_MAIN_LOOP();
void CHECK_KEY();
void CV_ALPHA_BREND2(IplImage *imgA,IplImage *imgB,IplImage *output,double alpha = 0.5);
/************ メイン関数 ****************/
int main( int argc, char **argv)
{
cvNamedWindow("window",CV_WINDOW_AUTOSIZE);
CV_MAIN_LOOP();
return 0;
}
/******** OpenCVのメインループ *********/
double a=0;
inline void CV_MAIN_LOOP()
{
IplImage *imgA[IMAGE_NUM];
for(int i = 0; i < IMAGE_NUM;i++)
{
imgA[i]= cvLoadImage( file[i], CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
if(imgA[i] ==NULL)
{
cout << file[i] <<" : Can't Load Image ." << endl;
std::exit(0);
}
}
IplImage *alpha = cvCreateImage(cvGetSize(imgA[0]),IPL_DEPTH_8U,3);
cvShowImage("window",imgA[1]);
while(1)
{
CHECK_KEY();
CV_ALPHA_BREND2(imgA[0],imgA[1],alpha,a);
cvShowImage("window",alpha);
}
}
void CHECK_KEY()
{
static char key;
key = (char)cvWaitKey(0);
switch(key)
{
case '\033':
std::exit(1);
break;
case '1':
a += 0.1;
if(a >1) a = 1;
break;
case '2':
a -= 0.1;
if(a<0)a = 0;
break;
}
}
void CV_ALPHA_BREND2(IplImage *imgA,IplImage *imgB,IplImage *output,double alpha)
{
IplImage *temp=cvCloneImage(imgA);
for(int j = 0;j<imgA->height;j++)
{
for(int i = 0;i<imgA->widthStep;i+=3)
{
temp->imageData[j*temp->widthStep + i] = char(alpha * unsigned char (imgA->imageData[j*imgA->widthStep + i]) + (1.0-alpha) * unsigned char (imgB->imageData[j*imgB->widthStep + i]));
temp->imageData[j*temp->widthStep + i+1] = char(alpha * unsigned char (imgA->imageData[j*imgA->widthStep + i + 1]) + (1.0-alpha) * unsigned char (imgB->imageData[j*imgB->widthStep + i + 1]));
temp->imageData[j*temp->widthStep + i+2] = char(alpha * unsigned char (imgA->imageData[j*imgA->widthStep + i + 2]) + (1.0-alpha) * unsigned char (imgB->imageData[j*imgB->widthStep + i + 2]));
}
}
cvCopy(temp,output);
cvReleaseImage(&temp);
}
#include <cv.h>
#include <highgui.h>
#include <iostream>
using namespace std;
char *file[]={"file5.jpg","file6.jpg"};
#define IMAGE_NUM 2
/**** 各種プロトタイプ宣言 ****/
inline void CV_MAIN_LOOP();
void CHECK_KEY();
void CV_ALPHA_BREND2(IplImage *imgA,IplImage *imgB,IplImage *output,double alpha = 0.5);
/************ メイン関数 ****************/
int main( int argc, char **argv)
{
cvNamedWindow("window",CV_WINDOW_AUTOSIZE);
CV_MAIN_LOOP();
return 0;
}
/******** OpenCVのメインループ *********/
double a=0;
inline void CV_MAIN_LOOP()
{
IplImage *imgA[IMAGE_NUM];
for(int i = 0; i < IMAGE_NUM;i++)
{
imgA[i]= cvLoadImage( file[i], CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
if(imgA[i] ==NULL)
{
cout << file[i] <<" : Can't Load Image ." << endl;
std::exit(0);
}
}
IplImage *alpha = cvCreateImage(cvGetSize(imgA[0]),IPL_DEPTH_8U,3);
cvShowImage("window",imgA[1]);
while(1)
{
CHECK_KEY();
CV_ALPHA_BREND2(imgA[0],imgA[1],alpha,a);
cvShowImage("window",alpha);
}
}
void CHECK_KEY()
{
static char key;
key = (char)cvWaitKey(0);
switch(key)
{
case '\033':
std::exit(1);
break;
case '1':
a += 0.1;
if(a >1) a = 1;
break;
case '2':
a -= 0.1;
if(a<0)a = 0;
break;
}
}
void CV_ALPHA_BREND2(IplImage *imgA,IplImage *imgB,IplImage *output,double alpha)
{
IplImage *temp=cvCloneImage(imgA);
for(int j = 0;j<imgA->height;j++)
{
for(int i = 0;i<imgA->widthStep;i+=3)
{
temp->imageData[j*temp->widthStep + i] = char(alpha * unsigned char (imgA->imageData[j*imgA->widthStep + i]) + (1.0-alpha) * unsigned char (imgB->imageData[j*imgB->widthStep + i]));
temp->imageData[j*temp->widthStep + i+1] = char(alpha * unsigned char (imgA->imageData[j*imgA->widthStep + i + 1]) + (1.0-alpha) * unsigned char (imgB->imageData[j*imgB->widthStep + i + 1]));
temp->imageData[j*temp->widthStep + i+2] = char(alpha * unsigned char (imgA->imageData[j*imgA->widthStep + i + 2]) + (1.0-alpha) * unsigned char (imgB->imageData[j*imgB->widthStep + i + 2]));
}
}
cvCopy(temp,output);
cvReleaseImage(&temp);
}