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

DirecTwiX

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

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

  • Посещение

  • Days Won

    1

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


  1. g_camInfo.cscd.load("haarcascade_frontalface_alt.xml");

    Перенёс проект на другой комп и на этой строчке появляется Unhandled exception... Что это может быть? Нашёл файл с исходным кодом этой функции... Можно ли посмотреть на какой строке именно вылетает?

    Но вот эта строка нормабльно загружает каскад:

    cscd = (CvHaarClassifierCascade*)cvLoad("haarcascade_frontalface_alt.xml", 0, 0, 0 );

    Помню раньше такая же бага была с матрицами и умельцы придумали такой выход:

    IplImage* img = cvLoadImage("greatwave.jpg", 1);

    Mat mtx(img); // convert IplImage* -> cv::Mat

    Может что-нибудь подобное и для каскадов замутить можно?


  2. Была идея написать такой алгоритм, когда распознавание текста писал. Оказывается такое уже есть в большом количестве)

    Сейчас вот думаю... Если у букв выделить скелет, а потом распознать с помощью Hu моментов, то поидее должно быть очень неплохо.

    З.ы. В проге из второго поста есть небольшой баг - при нажатии на "<->" пиксели, лежащие на нижней границе первого изображения, не затираются.


  3. Можно предварительно по цвету найти области. И проверить их, а не все изображение.

    А GPU - шный вариант Хаара не пробовали?

    И еще, там есть опция FIND_BIGGEST_OBJECT, находит один самый большой объект. Существенно ускоряет процесс.

    А можно ссылко на эту функцию? И FIND_BIGGEST_OBJECT надо в flags писать?

    p.s. Искал на willowgarage и itseez =\

    Pavia00, а Вы алгоритм сами писали? Можно ссылку на материал, которым руководствовались?

    Upd:

    FIND_BIGGEST_OBJECT кардинально меняет ситуацию) Если количество лиц на кадре не меняется (вроде так), то на расчёты требуется чуть ли не в 20 раз меньше времени. За 63мс вместо 1200мс) Еще раз спасибо


  4. Хаар долго работает. Разрешение если только уменьшать... Что плохо скажется на качестве. Первые тем 10 в поиске обыскал =\

    Upd: Скорость работы распознавание Хаара будет зависеть только от ЦП? Если на i7 запустить такую штуку, то за сколько она сможет найти лицо? Ориентировочно... (У меня проц старенький уже - 4.9 винда оценивает, и при сжатии 1.1 ему требуется 2 секунды)


  5. Вот адрес:

    http://svn.gna.org/viewcvs/pokersource/trunk/poker-eval/

    Скачал tortoiseSVN (и другой клиент тож качал), а он мне:

    Очень надо. Никто не сталкивался с такой проблемой?


  6. Ладно... Уговорили) У калькулятора ширина и в правду нечётной была =\

    Сколько тогда памяти выделять? Вот немного переписал:

    void Bmp2Mat(HDC hDC, HBITMAP hBmp, cv::Mat &img)
    
    {
    
    	BITMAPINFOHEADER bmi={0};
    
    
    	bmi.biSize = sizeof(BITMAPINFOHEADER);
    
    	GetDIBits(hDC, hBmp, 0, 0, 0, (BITMAPINFO*)&bmi, DIB_RGB_COLORS);
    
    	bmi.biPlanes=1;
    
    	bmi.biBitCount = 24;
    
    	bmi.biCompression = BI_RGB;
    
    
    	int size=3*bmi.biHeight*bmi.biWidth;
    
    	bmi.biHeight=-bmi.biHeight;
    
    	BYTE *bmpData = new BYTE[size];
    
    	GetDIBits(hDC, hBmp, 0, -bmi.biHeight, bmpData, (BITMAPINFO*)&bmi, DIB_RGB_COLORS);
    
    
    	img=cv::Mat(-bmi.biHeight, bmi.biWidth, CV_8UC3);
    
    	memcpy(img.data, bmpData, size);
    
    	delete [] bmpData;
    
    }
    UPD: если перед int size=... добавить
    	if (bmi.biWidth%4)
    
    		bmi.biWidth=4-bmi.biWidth%4+bmi.biWidth;

    То всё будет работать... Но если ширина изображения не кратна 4, то справа появляются лишние столбы (от 1 до 3). Пробовал уменьшать размер матрицы - безрезультатно.


  7. 1. Иначе изображение будет перевёрнутым

    2. Какие строки имеются в виду? GetDIBits и Img.data - это один длинный участок в памяти

    3. А сколько? 24 бита на цвет -> всего 2^24 возможный цветов

    Проблема решена. Оказалось, что везде работает, кроме калькулятора (win7). У него с шириной какая-то бага. По факту она 1 пиксель больше чем выдаёт GetWindowRect/GetClientRect =)


  8. Неделю назад написал такую функцию:

    void Bmp2Mat(HDC hDC, HBITMAP hBmp, cv::Mat &img8UC3)
    
    {
    
    	int size=3*img8UC3.cols*img8UC3.rows;
    
    	BYTE *bmpData = new BYTE[size];
    
    
    	BITMAPINFOHEADER bmi={0};
    
    
        bmi.biSize = sizeof(BITMAPINFOHEADER);
    
        bmi.biPlanes = 1;
    
        bmi.biBitCount = 24;
    
    	bmi.biWidth = img8UC3.cols;
    
    	bmi.biHeight = -img8UC3.rows;
    
        bmi.biCompression = BI_RGB;
    
    
    	GetDIBits(hDC, hBmp, 0, img8UC3.rows, bmpData, (BITMAPINFO*)&bmi, DIB_RGB_COLORS);
    
    
    	memcpy(img8UC3.data, bmpData, size);
    
    	delete [] bmpData;
    
    }

    Вытаскивал матрицу из HDC... Работала (да и до сих пор работает) без пререканий, но только на одном окне (мне в принципе другие не нужны, но разобраться хочется). Сегодня решил потестить для окна калькулятора...

    И что я увидел? Ошибку "Heap corruption detected"... Оказалось, что GetDIBits каким-то образом пишет за пределы массива... Гуглил-гуглил и вот что нашёл: http://www.rsdn.ru/forum/winapi/111983.flat.aspx

    Там похожая проблема, но только для 4 бит (сказали, что функа ещё палитру пытается всунуть). Мне добавить в bmi массив размера 2^24????

    На msdn вроде написано, что палитру не должно записывать =\

    Да и почему для одного окна работает, а для другого сыпется?


  9. Дело в MatchShapes. Очень плохая функция. Можно использовать только для достаточно больших контуров (буквы отпадают). Сам недавно писал распознавание текста... Сначала мучался с HU моментами, потом понял что к чему и отказался от них полностью. Работал с вектор-контурами (получилось немного по-сложней, но результат того стоил)


  10. Нашёл я функцию перевода HBitmap в IplImage. Решил переписать для cvMat.

    При запуске вылетает умирает процесс, чей DC я использовал :D

    void hBitmap2Mat(HBITMAP hBmp, cv::Mat &img)
    
    {
    
    	BITMAP bmp;
    
    	GetObject(hBmp,sizeof(BITMAP),&bmp);
    
    	int nChannels = bmp.bmBitsPixel == 1 ? 1 : bmp.bmBitsPixel/8;
    
    	int depth = bmp.bmBitsPixel == 1 ? IPL_DEPTH_1U : IPL_DEPTH_8U;
    
    	cv::Mat imgT(bmp.bmHeight, bmp.bmWidth, CV_MAKETYPE(depth, nChannels));
    
    	memcpy(imgT.data,(char*)(bmp.bmBits),bmp.bmHeight*bmp.bmWidth*nChannels);
    
    	img=imgT;
    
    }
    
    
    ...
    
            RECT rect;
    
    	GetClientRect(hWnd, &rect);
    
    
    	int cx, cy;
    
    	cx=rect.right-rect.left;
    
    	cy=rect.bottom-rect.top;
    
    	HBITMAP hBmp = CreateCompatibleBitmap(hDC, cx, cy);
    
    	SelectObject(myDC, hBmp);
    
    	BitBlt(myDC, 0, 0, cx, cy, hDC, rect.left, rect.top, SRCCOPY);
    
    
    	cv::Mat img;
    
    	hBitmap2Mat(hBmp, img);
    
    	cv::imshow("1", img);
    
    	cv::waitKey(0);
    
    
    Вот. Спустя день... Я написал эту штуку) Думаю, пригодится кому-нибудь:
    void Bmp2Mat(HDC hDC, HBITMAP hBmp, Mat &img)
    
    {
    
        BYTE *bmpData = new BYTE[3*img.cols*img.rows];
    
        BITMAPINFOHEADER bmi={0};
    
    
        bmi.biSize = sizeof(BITMAPINFOHEADER);
    
        bmi.biPlanes = 1;
    
        bmi.biBitCount = 24;
    
        bmi.biWidth = img.cols;
    
        bmi.biHeight = -img.rows;
    
        bmi.biCompression = BI_RGB;
    
    
        GetDIBits(hDC, hBmp, 0, img.rows, bmpData, (BITMAPINFO*)&bmi, DIB_RGB_COLORS);
    
        memcpy(img.data, bmpData, 3*img.cols*img.rows);
    
        delete [] bmpData;
    
    }

    • Like 2
×