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

Проблема с cvCvtColor

Recommended Posts

Здравствуйте!

Не работает пример из "Learning Opencv" by Gary Bradski and Adrian Kaehler, страница 242, contours, Example 8-2. Вот код, который я пытаюсь запустить:

#include <cv.h>
#include <highgui.h>

IplImage* g_image = NULL;
IplImage* g_gray = NULL;

CvMemStorage* g_storage = NULL;

int main( int argc, char** argv )
{
cvNamedWindow( "Contours", CV_WINDOW_AUTOSIZE );

CvCapture* capture = cvCreateCameraCapture(0);
IplImage* g_image = cvQueryFrame(capture);

g_gray = cvCreateImage( cvGetSize(g_image), 8, 1 );
g_storage = cvCreateMemStorage(0);
CvSeq* contours = 0;
cvCvtColor( g_image, g_gray, CV_BGR2GRAY );
cvThreshold( g_gray, g_gray, 100, 255, CV_THRESH_BINARY );
cvFindContours( g_gray, g_storage, &contours );
cvZero( g_gray );
if( contours )
cvDrawContours(
g_gray,
contours,
cvScalarAll(255),
cvScalarAll(255),
100
);

cvShowImage( "Contours", g_gray );

cvWaitKey();
return 0;
}[/codebox]

При компиляции ошибок не возникает. Ошибка возникает при работе программы, сразу же:

opencverror.JPG

Использую Visual Studio 2008, русская версия; OpenCV 2.0.0;

Вывод:

[codebox]"opencvsample.exe": Загружено: "C:\opencvsample\opencvsample\Debug\opencvsample.exe", Символы загружены.
"opencvsample.exe": Загружено "C:\WINDOWS\system32\ntdll.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\kernel32.dll"
"opencvsample.exe": Загружено: "C:\opencvsample\opencvsample\Debug\cv200.dll", Двоичный код не был построен с отладочной информацией.
"opencvsample.exe": Загружено: "C:\opencvsample\opencvsample\Debug\libcxcore200.dll", Двоичный код не был построен с отладочной информацией.
"opencvsample.exe": Загружено "C:\WINDOWS\system32\msvcrt.dll"
"opencvsample.exe": Загружено: "C:\opencvsample\opencvsample\Debug\highgui200.dll", Двоичный код не был построен с отладочной информацией.
"opencvsample.exe": Загружено "C:\WINDOWS\system32\advapi32.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\rpcrt4.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\secur32.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\comctl32.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\gdi32.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\user32.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\ole32.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\oleaut32.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\avicap32.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\winmm.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\version.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\msvfw32.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\shell32.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\shlwapi.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\avifil32.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\msacm32.dll"
"opencvsample.exe": Загружено: "C:\opencvsample\opencvsample\Debug\cxcore200.dll", Двоичный код не был построен с отладочной информацией.
"opencvsample.exe": Загружено: "C:\WINDOWS\WinSxS\x86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_597c3456\msvcr90d.dll", Символы загружены.
"opencvsample.exe": Загружено "C:\WINDOWS\system32\imm32.dll"
"opencvsample.exe": Загружено "C:\Program Files\Kaspersky Lab\Kaspersky Internet Security 7.0\adialhk.dll"
"opencvsample.exe": Выгружено: "C:\Program Files\Kaspersky Lab\Kaspersky Internet Security 7.0\adialhk.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83\comctl32.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\uxtheme.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\MSCTF.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\MSCTFIME.IME"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\clbcatq.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\comres.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\devenum.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\setupapi.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\wintrust.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\crypt32.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\msasn1.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\imagehlp.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\msdmo.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\qcap.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\quartz.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\ksproxy.ax"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\ksuser.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\vidcap.ax"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\atl.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\kswdmcap.ax"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\mfc42.dll"
"opencvsample.exe": Загружено: "C:\WINDOWS\system32\mfc42loc.dll", Двоичный код не был построен с отладочной информацией.
"opencvsample.exe": Загружено "C:\WINDOWS\system32\qedit.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\comdlg32.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\ddraw.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\dciman32.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\d3dim700.dll"
"opencvsample.exe": Загружено "C:\WINDOWS\system32\msyuv.dll"
Первый этап обработки исключения в "0x1002e4e4" в "opencvsample.exe": 0xC0000005: Нарушение прав доступа при чтении "0xffffffff".
Необработанное исключение в "0x1002e4e4" в "opencvsample.exe": 0xC0000005: Нарушение прав доступа при чтении "0xffffffff".

Устанавливал OpenCV по этой инструкции: http://nashruddin.com/OpenCV_2_0_Installat...ual_Studio_2008

Очень надеюсь на Вашу помощь и заранее большое спасибо!

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


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

Ты лучше окно call stack в момент ошибки приведи - там и будет ответ.

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


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

Пожалуйста, привожу:


cv200.dll!1002e4e4()
[Указанные ниже фреймы могут быть неверны и (или) отсутствовать, символы для cv200.dll не загружены]
ole32.dll!774f0b37()
ole32.dll!774f0b52()
ole32.dll!774ff4cb()
ole32.dll!77500432()
ole32.dll!774ed73c()
quartz.dll!747e6e35()
ole32.dll!774ff8c5()
ntdll.dll!7c90cf5c()
ntdll.dll!7c91a283()
ntdll.dll!7c918f01()
ntdll.dll!7c9192ef()
ntdll.dll!7c918f01()
ntdll.dll!7c9101bb()
ntdll.dll!7c96d994()
ntdll.dll!7c927553()
ntdll.dll!7c927764()
ntdll.dll!7c91003d()
ntdll.dll!7c9101bb()
ntdll.dll!7c9101bb()
msvcrt.dll!77c1c3c9()
msvcrt.dll!77c1c3e7()
msvcrt.dll!77c1c42e()
msvcrt.dll!77c1c42e()
cv200.dll!101c9367()
msvcrt.dll!77c1c3c9()
msvcrt.dll!77c1c3e7()
msvcrt.dll!77c1c42e()
cxcore200.dll!0081766b()
> opencvsample.exe!main(int argc=1, char * * argv=0x003f5a10) Строка 19 + 0x11 байт C++
opencvsample.exe!__tmainCRTStartup() Строка 582 + 0x19 байт C
opencvsample.exe!mainCRTStartup() Строка 399 C
kernel32.dll!7c817067() [/codebox]

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


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

Для начала, надо бы проверять, захвачен, ли кадр с камеры (не равен ли указатель g_image NULL). Если он NULL , то у Вас будет выпадать нечто подобное, т.к. Вы обращаетесь к этому кадру, чтобы получить его размер, а его нет. Следующий момент - нет цикла захвата с камеры.

Возьмите любой пример из директории samples в папке с opencv. И скомпилируйте его.

ЗЫ: в этой книжке много ошибок.

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


Ссылка на сообщение
Поделиться на других сайтах
Для начала, надо бы проверять, захвачен, ли кадр с камеры (не равен ли указатель g_image NULL). Если он NULL , то у Вас будет выпадать нечто подобное, т.к. Вы обращаетесь к этому кадру, чтобы получить его размер, а его нет. Следующий момент - нет цикла захвата с камеры.

Возьмите любой пример из директории samples в папке с opencv. И скомпилируйте его.

ЗЫ: в этой книжке много ошибок.

Добавил проверку кадра и немного изменил код. Он стал таким:

#include <cv.h>
#include <highgui.h>

IplImage* g_image = NULL;

int main( int argc, char** argv )
{
cvNamedWindow( "Contours", CV_WINDOW_AUTOSIZE );

CvCapture* capture = cvCreateCameraCapture(0);
IplImage* g_image = cvQueryFrame(capture);
if (g_image) {
CvSeq* contours = 0;
IplImage* g_gray = cvCreateImage(cvGetSize(g_image), g_image->depth, 1);

cvCvtColor( g_image, g_gray, CV_BGR2GRAY );
cvThreshold( g_gray, g_gray, 100, 255, CV_THRESH_BINARY );
CvMemStorage* storage = cvCreateMemStorage(0);
cvFindContours( g_gray, storage, &contours );
cvZero( g_gray );
if( contours )
cvDrawContours(
g_gray,
contours,
cvScalarAll(255),
cvScalarAll(255),
100
);

cvShowImage( "Contours", g_gray );

cvWaitKey();
}
return 0;
}[/codebox]

Цикл захвата кадров с камеры не нужен: достаточно одного кадра с камеры.

Если закомментировать эти строчки:

[codebox]CvMemStorage* storage = cvCreateMemStorage(0);
cvFindContours( g_gray, storage, &contours );

То всё работает. Если их оставить -- появляется та самая ошибка, про которую я говорил в начале.

Какие у вас ещё есть предположения?

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


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

Все примеры компилируются без ошибок, но не все скомпилированные примеры, которые уже шли с OpenCV работают.

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


Ссылка на сообщение
Поделиться на других сайтах
Все примеры компилируются без ошибок, но не все скомпилированные примеры, которые уже шли с OpenCV работают.

Я использую FindContours так: cvFindContours(img,storage,&contours,sizeof(CvContour),CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE,cvPiont(0,0))

;

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


Ссылка на сообщение
Поделиться на других сайтах
Я использую FindContours так: cvFindContours(img,storage,&contours,sizeof(CvContour),CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE,cvPiont(0,0))

;

Заменил на тот вариант, который используете Вы, соответственно код стал:

#include <cv.h>
#include <highgui.h>

IplImage* g_image = NULL;
CvMemStorage* storage = NULL;

int main( int argc, char** argv )
{
cvNamedWindow( "Contours", CV_WINDOW_AUTOSIZE );

CvCapture* capture = cvCreateCameraCapture(0);
IplImage* g_image = cvQueryFrame(capture);
if (g_image) {
CvSeq* contours = 0;
IplImage* g_gray = cvCreateImage(cvGetSize(g_image), g_image->depth, 1);

cvCvtColor( g_image, g_gray, CV_BGR2GRAY );
cvThreshold( g_gray, g_gray, 100, 255, CV_THRESH_BINARY );
CvMemStorage* storage = cvCreateMemStorage(0);
cvFindContours(g_gray, storage, &contours, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
//cvFindContours( g_gray, storage, &contours );
cvZero( g_gray );

if( contours )
cvDrawContours(
g_gray,
contours,
cvScalarAll(255),
cvScalarAll(255),
100
);

cvShowImage( "Contours", g_gray );

cvWaitKey();
}
return 0;
}[/codebox]

При компиляции ошибок не обнаружено, при запуске та же злополучная ошибка, что я описал в начале топика.

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


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

релиз так же работает как и отладочная версия? Просто там разные версии библиотек используются.

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


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

Пробую запустить релиз версию с кодом, который был в предыдущем моём сообщении, получаю вот это:

1>------ Построение начато: проект: opencvsample, Конфигурация: Release Win32 ------
1>Компиляция...
1>opencvsample9.cpp
1>Компоновка...
1>opencvsample9.obj : error LNK2001: неразрешенный внешний символ "_cvCvtColor"
1>opencvsample9.obj : error LNK2001: неразрешенный внешний символ "_cvFindContours"
1>opencvsample9.obj : error LNK2001: неразрешенный внешний символ "_cvSetZero"
1>opencvsample9.obj : error LNK2001: неразрешенный внешний символ "_cvCreateImage"
1>opencvsample9.obj : error LNK2001: неразрешенный внешний символ "_cvWaitKey"
1>opencvsample9.obj : error LNK2001: неразрешенный внешний символ "_cvGetSize"
1>opencvsample9.obj : error LNK2001: неразрешенный внешний символ "_cvDrawContours"
1>opencvsample9.obj : error LNK2001: неразрешенный внешний символ "_cvCreateMemStorage"
1>opencvsample9.obj : error LNK2001: неразрешенный внешний символ "_cvNamedWindow"
1>opencvsample9.obj : error LNK2001: неразрешенный внешний символ "_cvThreshold"
1>opencvsample9.obj : error LNK2001: неразрешенный внешний символ "_cvQueryFrame"
1>opencvsample9.obj : error LNK2001: неразрешенный внешний символ "_cvCreateCameraCapture"
1>opencvsample9.obj : error LNK2001: неразрешенный внешний символ "_cvShowImage"
1>C:\opencvsample\opencvsample\Release\opencvsample.exe : fatal error LNK1120: 13 неразрешенных внешних элементов
1>Журнал построения был сохранен в "file://c:\opencvsample\opencvsample\Release\BuildLog.htm"
1>opencvsample - ошибок 14, предупреждений 0
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
[/codebox]

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


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

ну ясно, библиотеки (lib) просто надо к проекту подключить для релиза. Отлпдочные с буквой d на конце например - cv200d.lib и dll ки с такой же системой названий.

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


Ссылка на сообщение
Поделиться на других сайтах
ну ясно, библиотеки (lib) просто надо к проекту подключить для релиза. Отлпдочные с буквой d на конце например - cv200d.lib и dll ки с такой же системой названий.

Библиотеки подключил, действительно в релиз версии все заработало! Мне теперь всегда использовать release версию вместо debug? В чем отличие библиотек в каждой из этих конфигураций?

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


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

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

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


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

Спасибо за помощь, Андрей!

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


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

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


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

У меня сегодня возникла точно такая же проблема, как и у автора темы. Пишу на CodeGear RAD Studio C++ Builder 2009. Версия OpenCV - 2.0a. Lib файлы делал сам с помощью implib(там не было dll с буквой d). Не могли бы вы подробно объяснить, что нужно сделать, чтобы устранить эту проблему?

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×