OpenGL de プログラミング - OpenCV::4チャネルで読み込む
現在地 >> メニュー >> サンプルコード::OpenCV >> OpenCV::4チャネルで読み込む

問題


以下の画像で背景が白くない部分をマスク部分と考え、
BGRAの4チャネルの画像として読み込んで表示せよ。

答え


#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;

}



テクスチャに利用する例 >> α値とテクスチャの切り抜き