2017-01-11 5 views
0

Я прочитал изображение (исходное изображение) в CvMat, используя cvLoadImage, и назначил его указатель на другой 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 (имя файла) на cvLoadImage (имя файла, CV_LOAD_IMAGE_GRAYSCALE); – eyllanesc

+1

Любая конкретная причина, по которой вы используете ** устаревший ** C api? – Miki

+0

@Miki Я хотел бы иметь другие операции CUDA в матрице данных изображения, поэтому я выбрал C api ... действительно стыдно, что я разместил этот грязный код – Zhang

ответ

1

Ваша проблема заключается в том, что ваше входное изображение на самом деле не является единственным каналом в оттенках серого 8UC1. То, что вы видите, - это первая треть изображения, где каждый пиксель BGR отображается как 3 оттенка серого.

Чтобы исправить это, вы можете либо прочитать свой ввод в оттенках серого, как @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 

Я действительно рекомендую вам использовать более высокую C++ API уровня с cv::Mat вместо этого.

Смежные вопросы