#include <iostream>
#include <cv.h>
#include <highgui.h>
//--------------- 各種外部変数 ----------------------------//
char *filename="sample.png";
//--------------- プロトタイプ宣言 ----------------------------//
IplImage *cvLoadImageBGRA(const char *filename,int iscolor = 1);
IplImage *GetMaskFromBGR(IplImage *BGRImg); //マスク画像を取得
//------------- メイン関数 ----------------------//
int main(int argc, char **argv)
{
IplImage *imgBGRA = cvLoadImageBGRA(filename,CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
if(imgBGRA == NULL )
{
std::cerr << "Can't Load Image\n";
return -1;
}
cvNamedWindow("RGBA",CV_WINDOW_AUTOSIZE);
cvShowImage("RGBA",imgBGRA);
cvReleaseImage( & imgBGRA);
cvWaitKey(0); // 0秒待つ => ずっと入力待ち
cvDestroyAllWindows();
return EXIT_SUCCESS;
}
//--------------- ここから各種関数 -----------------//
IplImage *cvLoadImageBGRA(const char *filename,int iscolor)
{
//RGBの3色
IplImage *ImgBGR = cvLoadImage(filename,iscolor);
if(ImgBGR == NULL) {return NULL;}
//マスク画像作成
IplImage *Mask = GetMaskFromBGR(ImgBGR);
if(Mask == NULL)
{
cvReleaseImage(&ImgBGR);
return NULL;
}
IplImage *BGRA = cvCreateImage(cvGetSize(ImgBGR),IPL_DEPTH_8U,4);
if(BGRA == NULL)
{
cvReleaseImage(&ImgBGR);
cvReleaseImage(&Mask);
return NULL;
}
const CvArr *InputPlane[2]={ImgBGR,Mask};
int from_to[] = { 0, 0, 1, 1, 2, 2, 3, 3 };
cvMixChannels(InputPlane,2,(CvArr**)&BGRA,1,from_to,4);
cvReleaseImage(&Mask);
cvReleaseImage(&ImgBGR);
return BGRA;
}
//--------- マスク画像の作成 ----------------//
IplImage *GetMaskFromBGR(IplImage *BGRImg)
{
//グレイスケール用
IplImage *gray = cvCreateImage(cvGetSize(BGRImg),IPL_DEPTH_8U,1);
if(gray == NULL){return NULL;}
//グレイスケール画像作成
cvCvtColor(BGRImg, gray, CV_BGR2GRAY);
//マスク画像の作成
cvThreshold(gray,gray,254,255,CV_THRESH_BINARY);
cvNot(gray,gray);
return gray;
}
テクスチャに利用する例 >>
α値とテクスチャの切り抜き