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

Vicul

Пользователи
  • Количество публикаций

    43
  • Зарегистрирован

  • Посещение

Репутация

0 Новичек

О Vicul

  • Звание
    Эксперт

Посетители профиля

1 137 просмотров профиля
  1. Конвертор формата BGR24 to YUYV

    значит буду капать дальше, спасибо за помощь!
  2. Конвертор формата BGR24 to YUYV

    Блин заработало!!! Дай Бог тебе здоровья и удачи. Полдня сидел, чуть себе резьбу не сорвал. Не понятно, почему CV_RGB2YCrC, ведь на вход у меня поступает bgr?
  3. Конвертор формата BGR24 to YUYV

    Со сдвигом разобрался, дело в том, что в приемном модуле у меня кодек был установлен как RAWVIDEO и заголовки типа BITMAP... там не нужны, потому все сдвигалось на размер этих заголовков. Но теперь проблема чисто opencv, изображение на выходе идет с синими лицами. С помощью cvSaveImage() определил, что bgr кадр поступает в конвертор c нормальными цветами, а вот на выходе идет уже с искажением на синий цвет. Где копать? коды конвертора в первом посте.
  4. Конвертор формата BGR24 to YUYV

    это понятно, что не правильный, только вот где? Вот здесь я заполняю BITMAPINFOHEADER в FFMPEG модуле для YUYV (аналог YUY2), может здесь я что то намутил? struct VIDEOSTRUCT { uint32_t lBufSize; uint32_t iWidth; uint32_t iHeight; int64_t iTime; uint8_t* pBuf; }; ....... list<VIDEOSTRUCT>::iterator delIter = VideoBuf.begin(); int headersSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); int bufSize = headersSize + delIter->lBufSize; PBYTE data = new BYTE [bufSize]; if (data != NULL) { BITMAPFILEHEADER* pbfHeader; BITMAPINFOHEADER* pbmiHeader; pbfHeader = (BITMAPFILEHEADER *)(data); pbfHeader->bfType = ('M' << CHAR_BIT) | 'B' ; //'MB'; pbfHeader->bfSize = bufSize; pbfHeader->bfOffBits = headersSize; pbfHeader->bfReserved1 = pbfHeader->bfReserved2 = 0; uint8_t* pData; pData = data + headersSize; pbmiHeader = (BITMAPINFOHEADER *)(pData - sizeof(BITMAPINFOHEADER)); pbmiHeader->biBitCount = 16; pbmiHeader->biWidth = delIter->iWidth; pbmiHeader->biHeight = delIter->iHeight; pbmiHeader->biPlanes = 1; pbmiHeader->biSize = sizeof(BITMAPINFOHEADER); pbmiHeader->biCompression = MAKEFOURCC('Y', 'U', 'Y', '2');//MAKEFOURCC('Y', 'U', 'Y', 'V');//MAKEFOURCC('Y', 'U', 'Y', 'V');//BI_RGB; pbmiHeader->biClrImportant = pbmiHeader->biClrUsed = pbmiHeader->biXPelsPerMeter = pbmiHeader->biYPelsPerMeter = 0; pbmiHeader->biSizeImage = DIBSIZE(*pbmiHeader);
  5. Конвертор формата BGR24 to YUYV

    Прикрепленный файл
  6. Работаю с программой, где я принимаю фреймы в BGR24 формате и передаю их в модуль, собранный на кодах FFMPEG, который передает их на тв сайт по RTMP протоколу. Все работает нормально, но возникла необходимость передавать фреймы не в BGR24, а в YUYV (YUY2), т.е, нужен конвертор BGR24 -> YUYV. Нашел коды на openCV, немного подправил их и получил одну фигню - концовка кадра почему то оказалась вначале, см. приатаченный файл. Не могу понять, где хомутнул, вот коды конвертора typedef struct _typeYUYV { char Y0; char U0; char Y1; char V0; } _typeYUYV; typedef enum _typeFormat { _NONE = 0, _UYVY, _YUYV } int ConvertBGRTo(char* pSrcBuf, size_t nSrcBufSize, _typeFormat nFormatType, char* pDstBuf, size_t& nDstBufSize, int outX, int outY) { int nRes = NO_ERROR; // Create IplImage for given BMP int nStep = outX*3; IplImage RgbImg; cvInitImageHeader( &RgbImg, cvSize(outX, outY), IPL_DEPTH_8U, 3 ); cvSetData( &RgbImg, (char*)pSrcBuf, nStep ); // Convert RGB24 to YUV (YCrCb) IplImage* pYuvImg = cvCloneImage(&RgbImg); cvCvtColor(&RgbImg,pYuvImg, CV_BGR2YCrCb); char* pDstBufEndPos = pDstBuf + nDstBufSize; for(int nCurYPos = outY - 1; nCurYPos > 0; nCurYPos--) { _typeYUV* pSrcBufCurPos = (_typeYUV*)(pYuvImg->imageData + nCurYPos * nStep); char* pSrcBufEndPos = (char*)pSrcBufCurPos + nStep; for(;(char*)pSrcBufCurPos < pSrcBufEndPos;) { _typeYUYV YUYV = { pSrcBufCurPos[0].Y, pSrcBufCurPos[0].U, pSrcBufCurPos[1].Y, pSrcBufCurPos[0].V }; if((pDstBuf + sizeof(_typeYUYV)) > pDstBufEndPos) break; memcpy(pDstBuf,&YUYV,sizeof(_typeYUYV)); pDstBuf += sizeof(_typeYUYV); if((char*)(pSrcBufCurPos + 2) > pSrcBufEndPos) break; pSrcBufCurPos += 2; } } cvReleaseImage(&pYuvImg); return nRes; } Поделитесь идеями?
  7. cvInvert

    cvNot() - тоже инвертирует и без всякого "геморроя".
  8. Проблема с дебагом

    Я вам еще раз настоятельно рекомендую не брать длл-ки со стороны, а сделать это самостоятельно для своего компилятора, ссылку я дал. CMake формирует проект инсталляции под конкретную среду, что у вас установлена. И если у вас не идет компиляция - значит проблема со студией и надо с ней разбираться. Удачи! PS, когда будешь конфигурить проект в CMake, возьми конфу по минимуму, т.е., всякие там питоны, тесты, экземплы по боку.
  9. Проблема с дебагом

    У меня на VS2005 и opencv1.1 было что-то подобное. Проблема была в настройках opencv1.1. Я снес тогда 1.1 и установил 2.0, вобщем, у тебя должно быть отдельные пути к длл-кам для релиза и дебага (см. детали в топике MS Visual C++ и OpenCV http://www.compvision.ru/forum/index.php?s...20&start=20 ). И еще заметил одну особенность работы OpenCV1.1 и MFC - не очень дружат они с друг с другом, особенно на дебаге, если идешь через такую экзотику как cvWaitKey() . У меня стало стабильно работать, когда обрабоку на OpenCV запустил в отдельный поток, а результаты обработки передовал уже основному потоку на MFC. Эта фигня у меня была на 1.1, на 2.0 еще не проверял.
  10. cvCloneImage()

    Короче, чтобы не забивать себе голову этим шагом,сделал подругому resultRotation = cvCreateImage(cvGetSize(result), result->depth, 3); cvCopyImage(result, resultRotation); cvNamedWindow("Result", 0); cvShowImage("Result", resultRotation); Спасибо за помощь.
  11. cvCloneImage()

    Ладно, завтра на свежую голову разберусь с этим.
  12. cvCloneImage()

    Он одинаковый. Вот в дебаге данные на хейдер и клон.
  13. cvCloneImage()

    Если бы неправильно, то хейдер неправильно бы показывал обрезанную картинку. Я проверял это перед тем как сделать клон.
  14. Работа с контурами

    Согласен, он лишний. > Пример работает так себе. не согласен, пример работает. Просто его немного надо адаптировать к реальной задаче. У меня на плате надо найти микросхему, так вот перед нахождением контуров пришлось использовать cvCalcBackProject() с гистограммой на микросхему, а все остальное по тексту.
  15. cvCloneImage()

    Всем привет, похоже я сегодня засиделся, что клинит меня на самом простом. Есть 3-х канальный имидж IplImage* img, я из него делаю имидж_хейдер IplImage* result = cvCreateImageHeader(cvSize(point[1].x - point[0].x, point[1].y - point[0].y), img->depth, img->nChannels); result->widthStep = img->widthStep; result->imageData = img->imageData + point[0].y * img->widthStep + point[0].x * img->nChannels; То что получил (result) прекрасно можно показать в окно. Теперь хочу с него сделать клон и показать в окне IplImage* resultRotation = cvCloneImage(result); resultRotation->origin = result->origin; cvShowImage("Result", resultRotation); Так вот, эта гадюка, на cvShowImage() вываливается в exception. Сил уже нет разбираться, где хомутнул.
×