Jump to content
Compvision.ru

Vicul

Пользователи
  • Content count

    43
  • Joined

  • Last visited

Community Reputation

0 Новичек

About Vicul

  • Rank
    Эксперт

Recent Profile Visitors

1,057 profile views
  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. Сил уже нет разбираться, где хомутнул.
×