Как загрузить картинку в IplImage с ip камеры без предварительного сохранения ее на диск?

Возможно это элементарный вопрос, но все таки я уже битый час мучаюсь. Подскажите как можно напрямую захватить кадр с IP камеры в IplImage, не сохраняя в промежуточный jpg файл?
Все работает, если картинку сначала сохранить, а потом уже загружать в IplImage с винта:
if ( URLDownloadToFileA(NULL,LPCSTR(m_url),LPCSTR(filename),0,NULL) == S_OK ) {
    IplImage *img = cvLoadImage(filename, CV_LOAD_IMAGE_COLOR);
    //...
}

где m_url - это строка, содержащая url запрос к snapshot'у (например: http://admin:123456@192.168.3.73/image.jpg), а filename - имя файла.
В приведенном примере все работает, картинка сохраняется, а потом загружается в IplImage *img.
Но мне очень хотелось бы получать изображение сразу, но следующий ход - не работает:
//if ( URLDownloadToFileA(NULL,LPCSTR(m_url),LPCSTR(filename),0,NULL) == S_OK ) {
    IplImage *img = cvLoadImage(/*filename*/m_url, CV_LOAD_IMAGE_COLOR);
    //...
//}

Пробовал гуглить, но ничего дельного найти не могу уже не первый час. Будьте добры, выручите и подскажите решение.
  • Вопрос задан
  • 3689 просмотров
Пригласить эксперта
Ответы на вопрос 5
lPestl
@lPestl Автор вопроса
Идет второй день. Возможно подскажите хотя бы решение с сохранением изображения в буфер и загрузки его из буфера? Либо с сохранением картинки в cash и последующему обращению к ней???
Ответ написан
Комментировать
lPestl
@lPestl Автор вопроса
Кончается второй день, а никто даже просто логического выхода из этой ситуации не предложил! Я ж даже код не прошу!
Ответ написан
Комментировать
lPestl
@lPestl Автор вопроса
Шел третий день...
Ответ написан
Комментировать
peleron
@peleron
Веду кружки по робототехнике
Преобразование IplImage в JPG реализуется с помощью процедуры cvEncodeImage - на выходе получаем полностью готовый JPG - со всеми атрибутами и мета-информацией.
Обратная процедура делается с помощью функции cvDecodeImage
Официальная документация н...
Пример, но для древнего opencv
Мой код для кодирования в JPG - к сожалению обратной процедуры не нашёл, но главное - понять JPG картинки передаются через CvMat структуры, главные поля которой - data.ptr и cols
#define MAX_JPEG_IMAGE_SIZE	1000000
int jpeg_params[] = { CV_IMWRITE_JPEG_QUALITY, 50, 0 };
CvMat* encodedMat;
IplImage* frame = 0;
CvCapture *capture;
int image_length;
unsigned char jpeg_image[MAX_JPEG_IMAGE_SIZE];
{
		cvWaitKey(100);
		frame = cvQueryFrame(capture);
		if (frame == NULL) {
			printf("ERROR %s() Can't query frame from camera.\n", __FUNCTION__);
			break;
		}
		encodedMat = cvEncodeImage(".jpeg", frame, jpeg_params);
		if (encodedMat == NULL) {
			printf("ERROR %s() Can't encode frame.\n", __FUNCTION__);
			break;
		}
		if (encodedMat->cols > MAX_JPEG_IMAGE_SIZE) {
			printf("ERROR %s() Size of encoded image (%d) exceeded maximum buffer size (%d).\n",
					__FUNCTION__, encodedMat->cols, MAX_JPEG_IMAGE_SIZE);
			break;
		}
		image_length = encodedMat->cols;
		memcpy(jpeg_image, encodedMat->data.ptr, image_length);
		cvReleaseMat(&encodedMat);
}
Ответ написан
Комментировать
@Brutalis
я пользуюсь следующим способом. под windows есть такая штука IP Camera DS Filter и graphstudio/ тут описано настрить все это
саму картинку получаем так
{
    {
    CvCapture* capture =  cvCaptureFromCAM( KAMIND );// где  KAMIND индекс камеры в системе
    //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    if(capture == NULL)// Если камер не обнаружено
     assert( capture );

                          cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 320);//1280);
                          cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT,240);//960);
                           int counter=0;
                           char filename[512];
                            while(true){
                                    // получаем кадр
                                    frame = cvQueryFrame( capture );
                                    // показываем

                                     cvShowImage("Video", frame);

                                    char c = cvWaitKey(33);
                                    if (c == 27) {break;} // нажата ESC
                                           else if(c == 13) { // Enter сохраняем кадр в файл
                                            sprintf(filename, "Image%d.jpg", counter);
                                            printf("[i] capture... %s\n", filename);
                                            cvSaveImage(filename, frame);cvSaveImage(filename, dst);
                                            counter++;}}
                            // освобождаем ресурсы
                            cvReleaseCapture( &capture );
                            cvDestroyWindow("capture");cvDestroyAllWindows();
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы