Steve_g 0 Жалоба Опубликовано October 5, 2012 Создал отдельную тему, поскольку название не совсем соответствует смыслу. Библиотека live555 отрабатывает так, что возвращает с камеры jpeg изображение в виде массива байт (unsigned char*). Далее с помощью библиотеки LibJPEG мы раскладываем этот массив на чисто данные unsigned char* data, ширину и высоту - unsigned int width и unsigned int height. Эти данные мы подаем на вход распознавателя, который ищет некие объекты на изображении. В случае, если они найдены - сохраняет полученное с камеры изображения в векторе. Далее эти изображения анализируются библиотекой cvblobs - вроде дополнение к OpenCV и по последовательно подаваемым фоткам получает блобы - соответствующие контурам двигающихся оъектов. Координаты объектов соответственно мы теперь тоже знаем. Итак - на выходе. Исходное изображение, координаты областей с объектами! Теперь предположим, нам нужна ЭЦП на картинку и данные. Как подписать данные - я знаю и сделал. а вот с картинкой не так все просто. Вернее было просто, когда была целая картинка - я подавал на вход функции массив байт (unsigned char* pictureData). Теперь же надо подписывать лишь вот эти куски большой картинки, которые содержат объекты. Описал проблему - теперь вопрос - надо как то вырезать из unsigned char* pictureData (jpeg картинка в виде байт-массива) вырезать cvRect (x,y,width,height) где x,y,width & height - величины относительно большой картинки. И привести к опять же виду массива байт - unsigned char*. Знаю, что ресурсы OpenCV и прилагающихся библиотек практически неисчерпаемы, соответственно я ОЧЕНЬ МНОГО каких функций не знаю - если ЕСТЬ - ПОДСКАЖИТЕ ПОЖАААЛУЙСТА! Заранее премного благодарен!! Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано October 6, 2012 Думаю сначала в Mat (cv::imdecode), затем вырезаете нужный кусок Mat m=img(Rect(x0,w),Rect(y0,h)).clone(); И кодируете обратно, если нужно (cv::imencode). Документация по cv::imdecode,cv::imencode тут: http://opencv.willowgarage.com/documentation/cpp/highgui_reading_and_writing_images_and_video.html Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Steve_g 0 Жалоба Опубликовано October 6, 2012 Спасибо большое, сейчас попробую)) потом отпишусь! Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Steve_g 0 Жалоба Опубликовано October 6, 2012 Прочитал - мое видение такое: struct RAWImage { std::vector<unsigned char> data; //чисто данные картинки после декомпрессии JPEG unsigned int width;//ширина JPEG unsigned int height;//высота JPEG unsigned int pixelBits; void* sourceImage;//указатель на буфер с исходным JPEG изображением, возвращаемый live555 }rawImage; cv::Mat matrixPre; cv::Mat matrixPost; unsigned short x, y, width, height;//они имеются в наличии cv::Rect rect(x,y,width,height);//прямоугольная область блоба int quality = 50;//качество matrixPre = cv::Mat(rawImage.height, rawImage.width, CV_8UC1, &(rawImage.data[0]));//НАДО ЛИ ТУТ ИСПОЛЬЗОВАТЬ cv::IMDECODE????? если НАДО - ПОСЛЕ этой строки? matrixPost = matrixPre(rect).clone();//вырезание из матрицы данных полученного блоба //теперь, очевидно, самый сок этого кода - получение массива байт JPEG полученной матрицы ??? std::vector<int> params;//4ый параметр функции params.push_back(CV_IMWRITE_JPEG_QUALITY); params.push_back(quality); vector<unsigned char> buf;//буфер под массив байт JPEG-a 3ий параметр - ВЕРНО?? //2ой параметр - очевидно matrixPost //1ый параметр - ".jpg" cv::imencode(".jpg", matrixPost, buf, params); //в итоге получаю массив байт JPEG-a скажите пожалуйста, что не верно я в этом куске говнокода сделал? ибо я не тестировал еще, связи с сервером нет( Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах