2017-01-11 16 views
0

cvLoadImageを使用してイメージ(元のイメージ)をCvMatに読み込み、そのデータポインタを中間データブロックで別のCvMatに割り当ててから、このCvMatをcvShowImageを使用して表示しますが、元のイメージの小さな領域のみが表示されました元の画像と同じサイズのウィンドウに表示されます。OpenCVを使って画像にデータを保存する方法は?

char* filename = "image\\neuron.tif"; // an 8bits grayscale image 
IplImage* iplImage = cvLoadImage(filename); 
int width = iplImage->width; 
int height = iplImage->height; 
cvNamedWindow("Original", CV_WINDOW_AUTOSIZE); 
cvShowImage("Original", iplImage); // showed properly 
cvWaitKey(); 

CvMat* header = cvCreateMatHeader(height, width, CV_8UC1); 
CvMat* img_mat = cvGetMat(iplImage, header); 


unsigned char* img_host = (unsigned char*)malloc(height * width * sizeof(unsigned char));// the intermediate data block, on which I need to apply a cuda operation 
img_host = img_mat->data.ptr; 
CvMat* blur_mat = cvCreateMat(height, width, CV_8UC1); 
blur_mat->data.ptr = img_host; 
cvNamedWindow("Blurred", CV_WINDOW_AUTOSIZE); 
cvShowImage("Blurred", blur_mat); // the problem described 
cvWaitKey(); 

image output 実は私は "img_host = img_mat-> data.ptr" をしようとすると、問題が発生しましたが、私は間違って何見当がつかない。

+0

cvLoadImage(filename、CV_LOAD_IMAGE_GRAYSCALE)にcvLoadImage(filename)を変更します。 – eyllanesc

+1

あなたが使用している特別な理由**廃止** C API? – Miki

+0

@Miki画像データマトリックス上に他のCUDA演算をしたいのですが、C APIを選択しました...この厄介なコードを投稿したことは本当に恥ずかしいです – Zhang

答えて

1

あなたの問題は、入力画像が実際には単一チャンネルのグレースケール8UC1画像ではないことです。あなたが見ているのは、各BGRピクセルが3つのグレースケールピクセルとして表示される画像の最初の3分の1です。

この問題を解決するには、コメントで提案されている@eyllanescのように入力をグレースケールで読み取るか、cvLoadImage(filename, CV_LOAD_IMAGE_GRAYSCALE);で入力します。

また、ターゲットを8UC3と宣言する必要があります。

いずれにせよ、あなたのコードは非常に厄介であり、少なくとも二つのメモリリークがここにあります

unsigned char* img_host = (unsigned char*)malloc(height * width * sizeof(unsigned char));// the intermediate data block, on which I need to apply a cuda operation 
img_host = img_mat->data.ptr; // LEAKS malloced buffer data 

CvMat* blur_mat = cvCreateMat(height, width, CV_8UC1); 
blur_mat->data.ptr = img_host; // LEAKS cvCreateMat() buffer data 

私は本当にあなたの代わりにcv::Matで、より高いレベルのC++ APIを使用することをお勧めします。

関連する問題