OpenGL de プログラミング - OpenCV::RGBA画像作成
現在地 >> メニュー >> サンプルコード::OpenCV >> OpenCV::RGBA画像作成


問題


以下のビットマップ画像を使って、32ビット(RGBA)のビットマップを作成し保存せよ。

元画像

アルファデータ画像

答え


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

using namespace std;

#define TEXT_N 2
const char *files[]={"test2.bmp","mask2.bmp"};


int main(int argc, char **argv)
{

IplImage *image1[TEXT_N];
IplImage *gray;

for(int i = 0;i<TEXT_N;i++)
{
image1[i]=cvLoadImage(files[i],CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
if(image1[i]==NULL)
{
printf("can't load image \n");
std::exit(0);
}

}

/*アルファデータ作成*/
gray = cvCreateImage(cvGetSize(image1[1]),IPL_DEPTH_8U,1);
cvCvtColor(image1[1], gray, CV_BGR2GRAY);
cvReleaseImage(&image1[1]);


/*RGBA画像作成(コピーを修正してゆく)*/
IplImage *rgba;
rgba = cvCloneImage(image1[0]);
rgba->nChannels = 4;
rgba->widthStep = rgba->widthStep *4 / 3;
rgba->imageSize = rgba->height * rgba->widthStep;


/*カラーデータ部*/
unsigned long size;
size = image1[0]->width*image1[0]->height*4;
rgba->imageData = new char[size];
unsigned long m=0;
unsigned long n=0;
for(unsigned long l = 0; l < size ;l+=4,m+=3,n++)
{
rgba->imageData[l]=(unsigned)image1[0]->imageData[m];
rgba->imageData[l+1]=(unsigned)image1[0]->imageData[m+1];
rgba->imageData[l+2]=(unsigned)image1[0]->imageData[m+2];
rgba->imageData[l+3]=(unsigned)gray->imageData[n];

}

cvReleaseImage(&image1[0]);
cvReleaseImage(&gray);

cvSaveImage("out.bmp",rgba);

cvReleaseImage(&rgba);

cout << "OK !"<< endl;

return 0;

}

メモ


3チャネルのコピーをつくり、それを修正して4チャネルにしている。
作った画像は、IplImage の中身が不正確かもしれない。