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

Vicul

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

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

  • Посещение

Сообщения, опубликованные пользователем Vicul


  1. Со сдвигом разобрался, дело в том, что в приемном модуле у меня кодек был установлен как RAWVIDEO и заголовки типа BITMAP... там не нужны, потому все сдвигалось на размер этих заголовков.

    Но теперь проблема чисто opencv, изображение на выходе идет с синими лицами. С помощью cvSaveImage() определил, что bgr кадр поступает в конвертор c нормальными цветами,

    а вот на выходе идет уже с искажением на синий цвет.

    Где копать? коды конвертора в первом посте.


  2. это понятно, что не правильный, только вот где?

    Вот здесь я заполняю 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);
    
    
    
    


  3. Работаю с программой, где я принимаю фреймы в 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;
    
    
    }
    
    
    

    Поделитесь идеями?


  4. скачал, но проверить не смог, cv200d.dll некоректен - ошибка инициализации. А у Вас этот код под дебагом коректно работает?

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

    PS, когда будешь конфигурить проект в CMake, возьми конфу по минимуму, т.е., всякие там питоны, тесты, экземплы по боку.


  5. У меня на 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 еще не проверял.


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

    Короче, чтобы не забивать себе голову этим шагом,сделал подругому

    		resultRotation = cvCreateImage(cvGetSize(result), result->depth, 3);

    cvCopyImage(result, resultRotation);

    cvNamedWindow("Result", 0);

    cvShowImage("Result", resultRotation);

    Спасибо за помощь.


  7. Да, поспешил. С этим все верно. Посмотрите WidthStep, все-таки, наверное он неправильный (будет меньше, т.к картинка обрезана).

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

    - result 0x0158fcd0 {nSize=112 ID=0 nChannels=3 ...} _IplImage *

    nSize 112 int

    ID 0 int

    nChannels 3 int

    alphaChannel 0 int

    depth 8 int

    + colorModel 0x0158fce4 "RGB" char [4]

    + channelSeq 0x0158fce8 "BGR" char [4]

    dataOrder 0 int

    origin 0 int

    align 4 int

    width 352 int

    height 275 int

    + roi 0x00000000 {coi=??? xOffset=??? yOffset=??? ...} _IplROI *

    + maskROI 0x00000000 {nSize=??? ID=??? nChannels=??? ...} _IplImage *

    imageId 0x00000000 void *

    tileInfo 0x00000000 _IplTileInfo *

    imageSize 290400 int

    + imageData 0x042341a4 "SC7QA5SC6SC6QB2TE5XH8WD5VA2S@1G7*kbTё·©РФЙРЧРРЬЦИЩХЙЮЫКаЮ‹ ќBPL,2-84/SH@[K?[H;TC6SB5SC3QA1P@0TD4SD4TE5TE5TE5TE5UF6WH8ZK;[O=`UAbTA_Q>LA-JC/Ѓmё»«ЪгЦЪеЫТЮШСЬЩУЮЫбиечьыэяяэяязлмбежйопксфисфбкоЛХЬ‰’›;DM&/8CKRNUXOTUPTUMRQ>DC6=:3:78?<9><4978=;BGEINL7<:)-.'+,%)*%(,),1'*/,/4((.'%+317**0''-,)2"!*!""()'-**0#&+$ char *

    widthStep 3060 int

    + BorderMode 0x0158fd1c int [4]

    + BorderConst 0x0158fd2c int [4]

    + imageDataOrigin 0x00000000 <Bad Ptr> char *

    - resultRotation 0x0158fd90 {nSize=112 ID=0 nChannels=3 ...} _IplImage *

    nSize 112 int

    ID 0 int

    nChannels 3 int

    alphaChannel 0 int

    depth 8 int

    + colorModel 0x0158fda4 "RGB" char [4]

    + channelSeq 0x0158fda8 "BGR" char [4]

    dataOrder 0 int

    origin 0 int

    align 4 int

    width 352 int

    height 275 int

    + roi 0x00000000 {coi=??? xOffset=??? yOffset=??? ...} _IplROI *

    + maskROI 0x00000000 {nSize=??? ID=??? nChannels=??? ...} _IplImage *

    imageId 0x00000000 void *

    tileInfo 0x00000000 _IplTileInfo *

    imageSize 290400 int

    + imageData 0x03dc0070 "SC7QA5SC6SC6QB2TE5XH8WD5VA2S@1G7*kbTё·©РФЙРЧРРЬЦИЩХЙЮЫКаЮ‹ ќBPL,2-84/SH@[K?[H;TC6SB5SC3QA1P@0TD4SD4TE5TE5TE5TE5UF6WH8ZK;[O=`UAbTA_Q>LA-JC/Ѓmё»«ЪгЦЪеЫТЮШСЬЩУЮЫбиечьыэяяэяязлмбежйопксфисфбкоЛХЬ‰’›;DM&/8CKRNUXOTUPTUMRQ>DC6=:3:78?<9><4978=;BGEINL7<;)-.'+,%)*%(,),1'*/,/4((.'%+317**0''-,)2"!*!""()'-**0#&+$ char *

    widthStep 3060 int

    + BorderMode 0x0158fddc int [4]

    + BorderConst 0x0158fdec int [4]

    + imageDataOrigin 0x03dc0070 "SC7QA5SC6SC6QB2TE5XH8WD5VA2S@1G7*kbTё·©РФЙРЧРРЬЦИЩХЙЮЫКаЮ‹ ќBPL,2-84/SH@[K?[H;TC6SB5SC3QA1P@0TD4SD4TE5TE5TE5TE5UF6WH8ZK;[O=`UAbTA_Q>LA-JC/Ѓmё»«ЪгЦЪеЫТЮШСЬЩУЮЫбиечьыэяяэяязлмбежйопксфисфбкоЛХЬ‰’›;DM&/8CKRNUXOTUPTUMRQ>DC6=:3:78?<9><4978=;BGEINL7<;)-.'+,%)*%(,),1'*/,/4((.'%+317**0''-,)2"!*!""()'-**0#&+$ char *


  8. по моему, указатель на данные мимо показывает (из-за смещения):

    <!--shcode-->

    result->imageData = img->imageData + 

    point[0].y * img->widthStep +

    point[0].x * img->nChannels;

    <!--ehcode-->

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


  9. Использовать cvCanny я думаю не стоит,

    Согласен, он лишний.

    > Пример работает так себе.

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


  10. Всем привет,

    похоже я сегодня засиделся, что клинит меня на самом простом.

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


  11. По идее можно, я не пробовал.

    Я уже попробовал - не проходит, требует регистрации. В приципе проблема ясна, думаю надо написать нормальный скрипт для инстала и использовать его во всех дальнейших проектах, как шаблон и не париться больше по этому поводу.

    Спасибо за помощь.


  12. Спасибо нашел этот ехе у них на сайте.

    Вы не пробовали устанавливать его длл-ки без запуска exe? Просто подсунуть их программе без регистрации?

    А то ломит мне инстал пак писать для этого.


  13. Лицензия свободная, тут засад нет.

    Это точно? И ее свободно (я имею виду легально) можно качнуть у мелкомягких? Или она все таки идет под лицензией

    студии с правом на неограниченные установки на компах заказчика?


  14. OpenCV dll'ки нуждаются в C++ библиотеках. Обычно с такой программой распространяют vcredist_x86.exe. Обычно устанавливается со студией.

    спасибо заработало,

    теперь надо разбираться еще с лицензией на vcredist_x86.exe,

    вообщем одни засады! :)


  15. Всем привет,

    опять поднимю эту тему, на этот раз с новой версией openCV2.0. Дело в том, что возникла проблема переноса проги с новыми длл-ками от 2.0 на другой комп, где нет openCV. При запуске проги получаю собщения типа

    The Application Failed To Initialize Properly (0xc0150002) итд.

    Хотя все нужные длл с OpenCV/Bin находятся в каталоге, где и прога.

    Перечисляю шаги

    1. Vista и VS2005 с SP1.

    2. Скачиваю openCV2.0 и устанавливаю пакет.

    3. С помощью CMake делаю конфигурацию. Получаю каталоги с проектом для VS2005.

    4. Запускаю этот проект и компилирую его. Здесь приходиться использовать опцию (Runtime Library) MD и MDd. Пытался использовать MT и MTd - не проходит, куча ошибок (за 600 перевалило, не находит переменные).

    5. вообщем вернулся к MD и MDd. После компиляции получаю несколько ошибок на проекты ( не ДЛЛ-очные , типа тест и тд). Игнорирую их, т.к. все длл-ки и lib-ы сформировались как для дебагера, так и для релиза.

    6. Прописываю пути к длл-кам OpenCV/Bin/debug и OpenCV/Bin/release в Виндовом окружении.

    7. Прописываю пути к инклуде и к либам (для дебага и релиза) в VS2005. Перезагружаю комп.

    8. Загружаю свой проект, с Runtime Library: Mtd и Mt. Перейти на MD и MDd не могу, у меня статический проект с MFC.

    9. Компилирую проект - проблем нет, получаю дебаг и релиз версии проги.

    10. Программа простая - вызов диалогового окна через MFC и по кнопке вызов трейда с функциями OpenCV: загрузить имидж и показать его в окне от OpenCV и потом по ESc закрыть его. Вообщем прога работает как в дебаге, так и в релизе.

    11. На другой комп с XP переношу релизовую копию и длл-ки от OpenCV/Bin запускаю и получаю

    The Application Failed To Initialize Properly (0xc0150002)...

    Вообщем сижу второй день, не могу обойти это. А ставить на другой комп OpenCV не хочу, задача требует запуск проги без установки OpenCV. Любые идеи????

×