Загрузка...

воскресенье, 11 июля 2010 г.

OpenCV и bada SDK: декодирование изображений

Стоит задача: воспользоваться функциями библиотеки компьютерного зрения в приложениях под bada SDK. Скажу, что над этой задачей я бился где-то с недельку, и прямо сейчас кайфую от достигнутого результата :) Приятное ощущение для программиста, не правда ли?!

Так вот. Я раскрою детали своего решения, чтобы обломать вам вашу возможность тоже заполучить такой кайф :) Не обессудьте ;)

Для начала нам надо
разобраться, что нужно для решения задачи. Подразумевается, что вы уже установили bada SDK и имеете некоторый опыт общения с ней, чтобы я тут не заострял внимание на мелочах. Дальше, нужна сама библиотека OpenCV. Ее можно скачать отсюда. Качаете архив с исходниками (никаких *-win32-vs2008.zip).

Все ниже изложенное будет касаться версии 2.1.0
Скачивать исходники нужно для того, чтобы получить бинарники, заточенные под платформу bada. Это важный момент! О том, как получить такие бинарники, написан отдельный пост.

Когда бинарники получены (*.lib и *.dll), делаем следующее: либы нужны для линковки и их прописываем в свойствах проекта (Project > Properties > C/C++ Build > Settings > вкладка Tool Settings > bada C++ Linker > Libraries). DLL-ки должны быть доступны через переменную среды PATH.
Если при запуске, симулятор вылетает в самом начале без каких-либо ошибок — 99% вероятность того, что проблема именно в недоступности DLL. Этот совет стоил мне нескольких дней мытарств.
Не забудьте также, в свойствах проекта (Project > Properties > C/C++ Build > Settings > вкладка Tool Settings > bada C++ Compiler > Directories), указать путь до инклудов рассматриваемой библиотеки.

Теперь все готово к работе. Дальше я поведаю о том, как работать с изображениями в среде bada. Следующий кусочек кода, несмотря на его простоту, дался мне большим количеством экспериментов.

#include <cv.h>
void TestingOpenCV() 
{
 String path(L"/Home/test.jpg");
 Image image;
 image.Construct();

 Bitmap *pBitmap = image.DecodeN(path, BITMAP_PIXEL_FORMAT_RGB565);

 BufferInfo bufferInfo;
 result r = pBitmap->Lock(bufferInfo);
 if (r == E_SUCCESS) {
  Decode(bufferInfo);
  pBitmap->Unlock();
 }
}
По коду, мы декодируем изображение в битмап. bada SDK поддерживает три формата, RGB565 среди которых наиболее удобоваримый. Чтобы работать с пикселями напрямую, необходимо вызвать Lock() и получить буфер данных. Далее идет функция конвертации в формат OpenCV.

void Decode(BufferInfo& bufferInfo) 
{
 cv::Mat mat(bufferInfo.height, bufferInfo.width, CV_8UC2, bufferInfo.pPixels);
 cv::Mat image;

 cv::cvtColor(mat, image, CV_BGR5652BGR);

 // continue working with *image* - native OpenCV format
}

Обратите внимание, что мы имитируем двухканальный 8-битный формат, хотя на самом деле изображение 16-битное и с 3 каналами. В этом вся магия! Ну, а дальше выполняем преобразование в обычный формат RGB and keep going! Переменная image — решение поставленной задачи.

blog comments powered by Disqus


 
^

Powered by BloggerCreative Commons License