Перейти к содержимому
Compvision.ru
Steve_g

Вырезание картинки из картинки

Recommended Posts

Создал отдельную тему, поскольку название не совсем соответствует смыслу. Библиотека 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 и прилагающихся библиотек практически неисчерпаемы, соответственно я ОЧЕНЬ МНОГО каких функций не знаю - если ЕСТЬ - ПОДСКАЖИТЕ ПОЖАААЛУЙСТА!

Заранее премного благодарен!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Думаю сначала в 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Прочитал - мое видение такое:

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

скажите пожалуйста, что не верно я в этом куске говнокода сделал? ибо я не тестировал еще, связи с сервером нет(

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×