Vicul
-
Количество публикаций
43 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные пользователем Vicul
-
-
Блин заработало!!!
Дай Бог тебе здоровья и удачи.
Полдня сидел, чуть себе резьбу не сорвал.
Не понятно, почему CV_RGB2YCrC, ведь на вход у меня поступает bgr?
-
Со сдвигом разобрался, дело в том, что в приемном модуле у меня кодек был установлен как RAWVIDEO и заголовки типа BITMAP... там не нужны, потому все сдвигалось на размер этих заголовков.
Но теперь проблема чисто opencv, изображение на выходе идет с синими лицами. С помощью cvSaveImage() определил, что bgr кадр поступает в конвертор c нормальными цветами,
а вот на выходе идет уже с искажением на синий цвет.
Где копать? коды конвертора в первом посте.
-
это понятно, что не правильный, только вот где?
Вот здесь я заполняю 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);
-
-
Работаю с программой, где я принимаю фреймы в 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; }
Поделитесь идеями?
-
-
скачал, но проверить не смог, cv200d.dll некоректен - ошибка инициализации. А у Вас этот код под дебагом коректно работает?Я вам еще раз настоятельно рекомендую не брать длл-ки со стороны, а сделать это самостоятельно для своего компилятора, ссылку я дал. CMake формирует проект инсталляции под конкретную среду, что у вас установлена. И если у вас не идет компиляция - значит проблема со студией и надо с ней разбираться. Удачи!
PS, когда будешь конфигурить проект в CMake, возьми конфу по минимуму, т.е., всякие там питоны, тесты, экземплы по боку.
-
У меня на 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 еще не проверял.
-
Ладно, завтра на свежую голову разберусь с этим.Короче, чтобы не забивать себе голову этим шагом,сделал подругому
resultRotation = cvCreateImage(cvGetSize(result), result->depth, 3);
cvCopyImage(result, resultRotation);
cvNamedWindow("Result", 0);
cvShowImage("Result", resultRotation);
Спасибо за помощь.
-
Я имею ввиду что ошибка здесь, а не в клонировании:result->widthStep = img->widthStep;
Ладно, завтра на свежую голову разберусь с этим.
-
Да, поспешил. С этим все верно. Посмотрите 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 *
-
по моему, указатель на данные мимо показывает (из-за смещения):<!--shcode-->
result->imageData = img->imageData +
point[0].y * img->widthStep +
point[0].x * img->nChannels;
<!--ehcode-->
Если бы неправильно, то хейдер неправильно бы показывал обрезанную картинку. Я проверял это перед тем как сделать клон.
-
Использовать cvCanny я думаю не стоит,Согласен, он лишний.
> Пример работает так себе.
не согласен, пример работает. Просто его немного надо адаптировать к реальной задаче. У меня на плате надо найти микросхему, так вот перед нахождением контуров пришлось использовать cvCalcBackProject() с гистограммой на микросхему, а все остальное по тексту.
-
Всем привет,
похоже я сегодня засиделся, что клинит меня на самом простом.
Есть 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. Сил уже нет разбираться, где хомутнул.
-
По идее можно, я не пробовал.Я уже попробовал - не проходит, требует регистрации. В приципе проблема ясна, думаю надо написать нормальный скрипт для инстала и использовать его во всех дальнейших проектах, как шаблон и не париться больше по этому поводу.
Спасибо за помощь.
-
Спасибо нашел этот ехе у них на сайте.
Вы не пробовали устанавливать его длл-ки без запуска exe? Просто подсунуть их программе без регистрации?
А то ломит мне инстал пак писать для этого.
-
Лицензия свободная, тут засад нет.Это точно? И ее свободно (я имею виду легально) можно качнуть у мелкомягких? Или она все таки идет под лицензией
студии с правом на неограниченные установки на компах заказчика?
-
OpenCV dll'ки нуждаются в C++ библиотеках. Обычно с такой программой распространяют vcredist_x86.exe. Обычно устанавливается со студией.спасибо заработало,
теперь надо разбираться еще с лицензией на vcredist_x86.exe,
вообщем одни засады!
-
Всем привет,
опять поднимю эту тему, на этот раз с новой версией 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. Любые идеи????
-
С Днем Программиста - 256-м днем в году!Присоединяюсь!
-
Спасибо за ссылки, пошел читать.
-
Подкиньте теорию, плз.
-
Всем привет! Подскажите пожалуйста как нарисовать CvBox2D?Вообще то это структура
typdef struct {
CvPoint2D32f center;
CvSize2D32f size;
float angle;
} CvBox2D;
Или я что-то пропустил?
-
Так вроде я и работаю с HSV, входящее изображение RGB сразу и преобразовываю...cvCvtColor(src, hsv, CV_BGR2HSV);
А что делает по твоему image2hist(IplImage *src)?
Конвертор формата BGR24 to YUYV
в OpenCV
Опубликовано · Report reply
значит буду капать дальше,
спасибо за помощь!