現在地 >> メニュー >> OpenCV >> IplImage編02 >> IplImage編02::直接アクセス >> IplImage編02::まとめ2
関連IplImage編02::まとめ1IplImage編02::まとめ3IplImage編02::まとめ4

問題

画像を読み込んで、ピクセルの値を書きかえよ。

答え

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

int main( int argc, char **argv)
{
	IplImage *imgA = cvLoadImage("test2.jpg");//グレイスケールで読み込む
	if(imgA == NULL){
		std::cerr << "Can't Load Image\n";
		return -1;
	}

	////アクセス方法1
	for(int y = 150; y < 200 ; ++y){
		for(int x = 200; x < 250; ++x){
			reinterpret_cast<unsigned char *>(imgA->imageData + y*imgA->widthStep)[x*imgA->nChannels]=255; //(x,y)の位置を255にする
			reinterpret_cast<unsigned char *>(imgA->imageData + y*imgA->widthStep)[x*imgA->nChannels+1]=255; //(x,y)の位置を255にする
			reinterpret_cast<unsigned char *>(imgA->imageData + y*imgA->widthStep)[x*imgA->nChannels+2]=255; //(x,y)の位置を255にする
		}
	}


	//アクセス方法1.5(キャストを少なくする)
	unsigned char* temp_ptr;
	for(int y = 150; y < 200 ; ++y){
		for(int x = 250; x < 300; ++x){
			temp_ptr = &( reinterpret_cast<unsigned char *>(imgA->imageData + y*imgA->widthStep)[x*imgA->nChannels] ) ;
			temp_ptr[0]= 255;
			temp_ptr[1]= 0;
			temp_ptr[2]= 255;
		}
	}

	//アクセス方法2
	for(int y = 400; y < 480 ; ++y){
		for(int x = 400; x < 480; ++x){
			imgA->imageData[y*imgA->widthStep + x*imgA->nChannels] = 100;
			imgA->imageData[y*imgA->widthStep + x*imgA->nChannels + 1] = 100;
			imgA->imageData[y*imgA->widthStep + x*imgA->nChannels + 2] = 100;
		}
	}

	//マクロを使ったアクセス
	for(int y = 50; y < 100 ; ++y){
		for(int x = 100; x < 150; ++x){
			CV_IMAGE_ELEM(imgA,unsigned char,y,x*imgA->nChannels)= 0;
			CV_IMAGE_ELEM(imgA,unsigned char,y,x*imgA->nChannels+1)= 255;
			CV_IMAGE_ELEM(imgA,unsigned char,y,x*imgA->nChannels+2)= 0;
		}
	}

	cvNamedWindow("Hello OpenCV",CV_WINDOW_AUTOSIZE);	
	cvShowImage("Hello OpenCV",imgA);

	cvWaitKey(0); // 0秒待つ => ずっと入力待ち
	cvReleaseImage(& imgA);  //メモリ解放
	
	cvDestroyWindow("Hello openCV");  //ウィンドウの破棄

	return 0;
}
×

この広告は60日間更新がないwikiに表示されております。

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






▲よろしければ広告のクリックもお願いします


▲ランキングに参加しました

管理人/副管理人のみ編集できます