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

cvCvtColor

Recommended Posts

Приветствую.

FImage:= cvQueryFrame(capture);

gray:= cvCreateImage(cvSize_(FImage^.width, FImage^.height), 8, 1);

cvCvtColor(FImage, gray, CV_BGR2GRAY);

работает ...

FImage:= cvLoadImage('faces\0.png', CV_LOAD_IMAGE_COLOR);

gray:= cvCreateImage(cvSize_(FImage^.width, FImage^.height), 8, 1);

cvCvtColor(FImage, gray, CV_BGR2GRAY);

не работает ...

Во втором случае загружаю цветной PNG сохраненный до этого cvSaveImage

Падает на cvCvtColor. Одинаково на OpenCV 2.0 (пересобранная в vs2008) и OpenCV 2.1

FImage во втором случае загружается, пробовал рисовать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Странно что не работает, может попробовать сделать три канала?

вот так:

gray:= cvCreateImage(cvSize_(FImage^.width, FImage^.height), 8, 3);

Хотя так не должно быть :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Кстати, это я пытаюсь переписать на Delphi (под свою задачу) логику вот отсюда (PCA_recognition):

Распознавание лиц методом главных компонент

Я не очень понял зачем там при загрузке изображений используется cvSplit (почему бы сразу не грузить в однослойный image?), поэтому (и еще потому что тестовая выборка у меня цветная а не ч/б) я решил использовать cvCvtColor как это сделано в facedetect (этот алгоритм очень простой, перенес быстро).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Тема закрыта. Проблема была в том что в цикле не подгружалось одно из многих изображений ...

Если кому нужно есть порт распознавания лиц методом главных компонентов на Delphi.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Тема закрыта. Проблема была в том что в цикле не подгружалось одно из многих изображений ...

Если кому нужно есть порт распознавания лиц методом главных компонентов на Delphi.

Если не жалко, то посмотрел бы...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вот архив, полагаю разберетесь (если потребуется поясню), это кусок проекта.

facedetect.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Аналогичная ситуацию, всегда падает на cvCvtColor(pImage, pGray, CV_BGR2GRAY);

Счем это может быть связанно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Людиии! Уже несколько десятков лет назад придумали отладчик. Научитесь в конце-концов им пользоваться!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Здравствуйте! У меня два вопроса!

Я пишу программу которая на данный момент должна находить в полез рения камеры две окружности и вычислять расстояние между их центрами.

В статике я все сделал, использовал для этого версию openCV 1.1 и Visual Studio 6.

Затем нужно было подключать камеру. Поствил Visual Studio 2008, к ней openCV 2.2. Камеру подключал через VideoInput из библиотеки openCV. Сделал оконное приложение.

Все работает хорошо. Затем решил сделать вызов окна настройки камеры через драйвер VI.showSettingsWindow(device1); окно появляется.

Вопрос 1!! Пробовал с встроенной камерой на ноутбуке, все прекрасно. Подключил внешнюю Genius iLook 300 окно настройки появляется но как только их начинаешь менять программа зависает. Настройки можно поменять если открыть постороннюю программу для камеры и там залезть в настройки и сохранить. Собственно вопрос! было ли у кого то такое и связано ли это только с драйвером камеры?

Вопрос 2. Не могу перегнать кадр в оттенки серого с помощью функции cvCvtColor. Компилятор ругается. Вот код функции


//ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ

IplImage* image = 0; //куда сохраняем кадр дл отображения


        videoInput VI; //объект videoinput

		int device1=0; // первое найденое видеоустройсво из списка


		bool STARTVIDEO=true; //переменная для закрытия окна opnCV

		// проверяется в конце функции void CopenCVWindowsDlg::OnBnClickedStart

//====================================================================

void CopenCVWindowsDlg::OnBnClickedStart()

{

	     IplImage* IMGgray = 0;  


        // получение списка доступных видеоустройств, возвращается число устройств

        int numDevices = VI.listDevices();



        // частота кадров

        VI.setIdealFramerate(device1, 20);


        // указываем разрешение

        VI.setupDevice(device1, 550, 400, VI_COMPOSITE);


        //VI.showSettingsWindow(device1); // показать окошко настроек камеры


        // создаём картинку нужного размера

        image = cvCreateImage(cvSize(VI.getWidth(device1),VI.getHeight(device1)), IPL_DEPTH_8U, 3);


        IMGgray= cvCreateImage(cvSize(VI.getWidth(device1),VI.getHeight(device1)), IPL_DEPTH_8U, 3);


        cvNamedWindow("SEARCH CICLE OPENCV", CV_WINDOW_AUTOSIZE);

		cvMoveWindow("SEARCH CICLE OPENCV",400  , 100); //подвинем окошко что бы не загораживал форму

// программы

		cvNamedWindow("gray", CV_WINDOW_AUTOSIZE);


        while(1){

                if (VI.isFrameNew(device1))

				{

                        // первый параметр - индекс видеоустройсва

                        // второй - указатель на буфер для сохранения данных

                        // третий - флаг, определяющий менять ли местами B и R -составляющий

                        // четвёртый - флаг, определяющий поворачивать картинку или нет

                        VI.getPixels(device1, (unsigned char *)image->imageData, false, true); // получение пикселей в BGR


						cvCvtColor(image,IMGgray,CV_RGB2GRAY);



                        //

                        // здесь уже можно работать с картинкой

                        // с помощью функций OpenCV

                        //


                        // показываем картинку

                        cvShowImage("SEARCH CICLE OPENCV", image);

						cvShowImage("gray", IMGgray);


                }


                char c = cvWaitKey(33);

                if (c == 27) 

				{ // ESC

                        break;

                }

				if (STARTVIDEO==false)

				{//если флаг будет "false" значит нужно выйти 

				 //из цикла и закрыть окно opnCV

					STARTVIDEO=true;

					break;

				}

        }


        // освобождаем ресурсы

        cvReleaseImage(& image);

		cvReleaseImage(& IMGgray);

        cvDestroyWindow("SEARCH CICLE OPENCV");

		cvDestroyWindow("gray");



        // останавливаем видеозахват

        VI.stopDevice(device1);



}

Вот что пишет компилятор

Compiling...

openCV WindowsDlg.cpp

c:\opencv2.2\include\opencv\opencv2\flann\logger.h(66) : warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

        c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(237) : see declaration of 'fopen'

Linking...

openCV WindowsDlg.obj : error LNK2001: unresolved external symbol _cvCvtColor

C:\Documents and Settings\User\Мои документы\Visual Studio 2008\Projects\openCV Windows UIM\Debug\openCV Windows.exe : fatal error LNK1120: 1 unresolved externals

Наконец вопрос)) Кто знает как это исправить или может есть другие пути для преобразования цветного в оттенки серого. Это нужно для использования функции openCV cvHoughCircles()

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Здесь видимо еще ошибка:

IMGgray= cvCreateImage(cvSize(VI.getWidth(device1),VI.getHeight(device1)), IPL_DEPTH_8U, 31);

А ошибка с cvCvtColor - это не подключенная библиотека (поищите эту функцию в Lib - файлах или просто подключите все либы). У меня эта функция в opencv_imgproc231.lib.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Действительно! я подключил opencv_imgproc220.lib потому как версия openCV 2.2 компилятор стал просить файл msvcr100d.dll. этот файл должен быть в папке c:\WINDOWS\system32\

скачал его отсюда http://dll-manuals.ru/26-skachat-dll-fayl-dll-biblioteku-msvcr100ddll-besplatno.html и все заработало!!ОГРОМНОЕ СПАСИБО ВАМ!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

а что касается первого вопроса про драйвер камеры, есть какие то предположения?

нужно будет попробовать с другой камерой, мне кажется дело в драйвере. хотя в другом приложении он работает!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я использовал такой код:


//--------------------------------------------------------------------------------
// Перечислитель всех видеодевайсов
// См. также:
// Using the System Device Enumerator:
// http://msdn2.microsoft.com/en-us/library/ms787871.aspx
//--------------------------------------------------------------------------------
int TCameraControl::enum_devices(void)
{
::CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
HRESULT hr;
// Создадим System Device Enumerator.
ICreateDevEnum *pSysDevEnum = NULL;
hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
IID_ICreateDevEnum, (void **)&pSysDevEnum);
if(FAILED(hr))
{
return hr;
}

// Obtain a class enumerator for the video input device category.
IEnumMoniker *pEnumCat = NULL;
hr = pSysDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnumCat, 0);

if(hr == S_OK)
{
// Enumerate the monikers.
IMoniker *pMoniker = NULL;
ULONG cFetched;
while(pEnumCat->Next(1, &pMoniker, &cFetched) == S_OK)
{
IPropertyBag *pPropBag;
hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag,
(void **)&pPropBag);
if(SUCCEEDED(hr))
{
// Получим человекочитаемое имя фильтра (камеры):
VARIANT varName;
VariantInit(&varName);
hr = pPropBag->Read(L"FriendlyName", &varName, 0);
if (SUCCEEDED(hr))
{
VariantClear(&varName);
// Для создания экземпляра фильтра сделаем следующее:
IBaseFilter *pFilter;
hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter,
(void**)&pFilter);
// В переменной varName.bstrVal содержится имя камеры
// Здесь имя камеры можно вывести printf-ом или записать в какой-нибудь список.
// думаю что Opencv видит камеры в том-же порядке.
}
//Не забудем потом освободить pFilter.
pPropBag->Release();
}
pMoniker->Release();
}
pEnumCat->Release();
}
pSysDevEnum->Release();

::CoUninitialize();
return 0;
}
//--------------------------------------------------------------------------------

[/code]

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

постараюсь это куда то пристроить)) огромное спасибо. Кстати сейчас попробовал запустить программу на другой машине, опять ругается на то что нет файла msvcP100d.dll. скопировал его по адресу, хотя на другой машине просил файл msvcR100d.dll Что же будет на другой машине))

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Еще одно падение CvtColor RGB2GRAY

Python,WinXP,Opencv2.0

Пишу код без использования функций


capture =highgui.cvCreateCameraCapture (0)

frgr= cv.cvCreateImage(cv.cvSize(640,480), 8, 1)

fr1 = highgui.cvQueryFrame(capture)

cv.cvCvtColor(fr1,frgr,cv.CV_RGB2GRAY)

highgui.cvShowImage("ff",frgr)

highgui.cvWaitKey(0)

Работает как часы. Но стоит сделать это функцией - Error: "...память не может быть 'read'"

def cvt(CamNumb):

    capture =highgui.cvCreateCameraCapture (CamNumb)

    frgr= cv.cvCreateImage(cv.cvSize(640,480), 8, 1)

    fr1 = highgui.cvQueryFrame(capture)

    cv.cvCvtColor(fr1,frgr,cv.CV_RGB2GRAY)

    highgui.cvShowImage("ff",frgr)

    highgui.cvWaitKey(0)


cvt(0)

Ругается четко на cvtColor, причем именно на XXX2GRAY. Пробовала RGB2BGR, RGB2HSV - все отлично.

RGB2GRAY, BGR2GRAY, RGBA2GRAY одинаково падают.

Может, дело в единственном канале? Глюк WinXP/PyScripter/OpenCV?

Помогите, пожалуйста! Может, кто-то сталкивался? Или это просто руки...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Может и глюк, тогда можно попробовать ему трехканальное подсунуть.

И еще:

Я конечно в питоне мало работал, но:

Вынес бы из функции (выполнял бы один раз), не нужно каждый раз инициализировать камеру и выделять память под изображение.

capture =highgui.cvCreateCameraCapture (CamNumb)
frgr= cv.cvCreateImage(cv.cvSize(640,480), 8, 1)[/code]

capture и frgr - тогда сделать глобальными.

И освободить память в конце программы не мешало бы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо за замечания - учту.

Не совсем поняла насчет "подсовывания" трехканального. Если объявить frgr 3х канальным

frgr= cv.cvCreateImage(cv.cvSize(640,480), 8, 3)
opencv будет праведно негодовать. А 3х канальное ч/б ни к чему т.к. мне его еще передавать(видео). Еще вопрос: если камер несколько,получается для каждой нужен свой capture? Тогда индексы камер просто идут по порядку, или их необходимо узнавать? И если процесс работы с камерой по сути бесконечен, память освобождать только при закрытии/падении программы? P.S. При появлении ошибки pyScripter ссылался на строчки из своих файлов. Решила глянуть, что не так. Наткнулась на описание ошибки:
# windows just has to be a bitch

Без коментариев...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

1) По поводу трехканального изображения, это просто "для попробовать".

2) По поводу камер, да, для каждой камеры свой capture. Обычно идут по порядку, причем "0" - первая доступная камера (обычно то же что и "1").

3) Да, освобождать ресурсы, (исключая fr1 , указатели на захваченный кадр освобождать не нужно) в конце работы программы.

По поводу PS, видно там много линуксоидов :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо:)

Организовала функцию в потоке и объявляю переменные в начале программы - перестал ругаться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вот архив, полагаю разберетесь (если потребуется поясню), это кусок проекта.

facedetect.zip

а можно выложить всю прогу целиком пожалуйста.если не жалко)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×