overlinder 0 Жалоба Опубликовано October 1, 2009 Как вывести IplImage на компоненту TImage в билдер? как вывести IplImage в окно с любым размером, а не CV_WINDOW_AUTOSIZE? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано October 1, 2009 Как вывести IplImage на компоненту TImage в билдер? как вывести IplImage в окно с любым размером, а не CV_WINDOW_AUTOSIZE? Здесь есть пример вывода на любой оконный компонент, зная его Handle: http://www.compvision.ru/forum/index.php?showtopic=2 Там-же есть такой кусок: //********************************************************* // Если не нужно подгонять размер кадра - это можно стереть // Выделяем память под копию кадра if( !frame_copy ) frame_copy = cvCreateImage( cvSize(352,288), IPL_DEPTH_8U, frame->nChannels ); // Масштабируем под заданный размер cvResize( frame, frame_copy, CV_INTER_LINEAR ); // Если не нужно подгонять размер кадра - это можно стереть //********************************************************* Где 352 и 288 и есть размер получаемого кадра(желаемый размер окна) который можно вывести стандартным способом. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
overlinder 0 Жалоба Опубликовано October 1, 2009 Каким образом хранится марица картинки в IplImage->imageData? хочу вывести построчно на TImage: IplImage *src_image = 0; char *image_line, *image_data; int h=Image2->Picture->Height; int w=Image2->Picture->Width; image_data=src_image->imageData; for (int i=0;i!=h;++i) { image_line=(char *)Image2->Picture->Bitmap->ScanLine; for(int j=0;j!=w;++j) image_line[j]=image_data[i*w+j]; } Image2->Refresh(); выводятся горизонтальные полоски Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано October 1, 2009 Каким образом хранится марица картинки в IplImage->imageData? хочу вывести построчно на TImage: IplImage *src_image = 0; char *image_line, *image_data; int h=Image2->Picture->Height; int w=Image2->Picture->Width; image_data=src_image->imageData; for (int i=0;i!=h;++i) { image_line=(char *)Image2->Picture->Bitmap->ScanLine; for(int j=0;j!=w;++j) image_line[j]=image_data[i*w+j]; } Image2->Refresh(); выводятся горизонтальные полоски Если три канала, то байты B,G,R,B,G,R... и строки вверх ногами относительно BMP . Если один (серое), то обычно, но тогда: unsigned char* image_data; // где-то раньше должно быть src_image= cvCreateImage( cvSize(width,height),IPL_DEPTH_8U,3); // *src_image не должен быть 0 cvGetRawData(src_image, (uchar**)&image_data); C=image_data[i*w+j]; Bitmap->ScanLine=C; Bitmap->ScanLine[i+1]=C; Bitmap->ScanLine[i+2]=C; i+=3; И еще ширина изображения в байтах равна img->widthStep, а не img->width*3, это так, для инфы. Когда ширина изображения кратна 8 то img->widthStep=img->width*3, а если нет тогда не равно. Вот тема была тут: http://www.compvision.ru/forum/index.php?showtopic=121 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах