openglとopencvを用いたアルファブレンディングについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
禊太郎

openglとopencvを用いたアルファブレンディングについて

#1

投稿記事 by 禊太郎 » 13年前

はじめまして。多少C++に慣れてきたところな禊太郎といいます。
修士の研究でIplImageにアルファ値を付与し、それを元にopenglでアルファブレンドをしようとしています。
ですが、どうにもうまくいきません。
具体的には、単純に色の暗い部分のアルファ値を低く、色の明るい部分のアルファ値を高くすることで、一般的なアルファ画像を作ろうとしていました。
明るさはその座標におけるRGBの最大値をそのまま転用しています。
しかし繰り返し部分でどこか妙なエラーでもあるのか、縦線ノイズのような透過まで発生してしまって困っています。
このノイズが出現しないようにする方法はないか、また私が何か見逃していないかチェックお願いします。
OSはVista VisualStudio2008を使用、言語はc++、GLUTとopencv2.2を使っています。

コード:

//IplImageの透過値設定
IplImage *IplAlpha_Set(IplImage *inputImage,int alphaflag,char *savename)
{
	IplImage *alpha_image= cvCreateImage( cvSize( inputImage->width , inputImage->height ) , inputImage->depth , 4 );
	cvCreateImage( cvSize( inputImage->width , inputImage->height ) , inputImage->depth , 4 );
	
	for( int y = 0 ; y < inputImage->height ; y++ ){
		for( int x = 0 ; x < inputImage->width ; x++ ){
			CvScalar c = cvGet2D( inputImage, y , x );

			if(alphaflag==0){
				c.val[3] = 255;
			}
			else{
				c.val[3] = (double)ImageRGBMax(alpha_image,x,y);
			}

			cvSet2D(alpha_image, y , x , c );
		}
	}
   	//実際のデータ確認
	cvSaveImage(savename,alpha_image);

	return alpha_image;
}

//1つの座標におけるRGBの最大値の取得
int ImageRGBMax(IplImage *inputImage,int x,int y)
{
	int maxvalue=0;
	
	int maxvalue_stack[3]={0,0,0};
	for(int color = BLUE;color <= RED;color++){
		maxvalue_stack[color]=(unsigned char)inputImage->imageData[inputImage->widthStep * y + x * 3 + color];
	}
	if(maxvalue_stack[BLUE]>=maxvalue_stack[GREEN]&&maxvalue_stack[BLUE]>=maxvalue_stack[RED])maxvalue=maxvalue_stack[BLUE];
	if(maxvalue_stack[GREEN]>=maxvalue_stack[BLUE]&&maxvalue_stack[GREEN]>=maxvalue_stack[RED])maxvalue=maxvalue_stack[GREEN];
	if(maxvalue_stack[RED]>=maxvalue_stack[GREEN]&&maxvalue_stack[RED]>=maxvalue_stack[BLUE])maxvalue=maxvalue_stack[RED];
	//printf("maxvalue = %d\n",maxvalue);

	return maxvalue;
}

禊太郎

Re: openglとopencvを用いたアルファブレンディングについて

#2

投稿記事 by 禊太郎 » 13年前

自己解決しました。IplAlpha_Set内でImageRGBMaxに渡すIplImageを間違えていました。
お騒がせ……とも言えませんがこんなことをぶちあげてしまって申し訳ありませんでした

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: openglとopencvを用いたアルファブレンディングについて

#3

投稿記事 by h2so5 » 13年前

ImageRGBMaxはもうちょっと簡潔に書けると思います。

コード:

#ifndef max
#define max(a, b) (a > b ? a : b)
#endif

//1つの座標におけるRGBの最大値の取得
unsigned char ImageRGBMax(IplImage *inputImage,int x,int y)
{
	unsigned char r, g, b;
	b = inputImage->imageData[inputImage->widthStep * y + x * 3 + color + 0];
	g = inputImage->imageData[inputImage->widthStep * y + x * 3 + color + 1];
	r = inputImage->imageData[inputImage->widthStep * y + x * 3 + color + 2];
    
	return max(r, max(g, b));
}

禊太郎

Re: openglとopencvを用いたアルファブレンディングについて

#4

投稿記事 by 禊太郎 » 13年前

わざわざ簡略化についても考えてくださり本当にありがとうございます!

閉鎖

“C言語何でも質問掲示板” へ戻る