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

Трабл: приложение из среды не запускается.

Recommended Posts

OpenCV 2.0a [DEBUG], MS VSE 9.0.30729.1 SP. Windows Vista SP1.

Не идёт приложение, если его запустить из среды (сначала один exception, потом другой...).

Трассировка показала, что проблема в cvCreateCameraCapture, внутри неё в cvCreateCameraCapture_DShow, а потом в неизбежном месте, относящемся к, собственно, DirectShow в функции bool CvCaptureCAM_DShow::open( int _index ).

Если приложение Win32, то можно два - четыре раза нажать "пропустить" исключение и дальше работа пойдёт как надо.

Если приложение CLR, то в конечном итоге всё выльется в неперехваченный SEH-эксепшн (как бы я его не перехватывал...) и приложение завершает свою работу.

Если запустить из Windows - всё, конечно же, работает как надо.

На форумах видел, что только сталкиваются с проблемой, но решения никто не привёл.

Вопрос: кто-нибудь знает, как преодолеть эту проблему и получить возможность отлаживать приложение в среде?

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


Ссылка на сообщение
Поделиться на других сайтах
OpenCV 2.0a [DEBUG], MS VSE 9.0.30729.1 SP. Windows Vista SP1.

Не идёт приложение, если его запустить из среды (сначала один exception, потом другой...).

Трассировка показала, что проблема в cvCreateCameraCapture, внутри неё в cvCreateCameraCapture_DShow, а потом в неизбежном месте, относящемся к, собственно, DirectShow в функции bool CvCaptureCAM_DShow::open( int _index ).

Если приложение Win32, то можно два - четыре раза нажать "пропустить" исключение и дальше работа пойдёт как надо.

Если приложение CLR, то в конечном итоге всё выльется в неперехваченный SEH-эксепшн (как бы я его не перехватывал...) и приложение завершает свою работу.

Если запустить из Windows - всё, конечно же, работает как надо.

На форумах видел, что только сталкиваются с проблемой, но решения никто не привёл.

Вопрос: кто-нибудь знает, как преодолеть эту проблему и получить возможность отлаживать приложение в среде?

Сталкивался с этим в OpenCV 1.0, сейчас таких проблем нет, может листинг приведете, есть вероятность что можно это обойти.

Запускал свои прогрммки (OpenCV 1.1pre1, OpenCV 2.0) из C++Builder6, VS2008, VS2005, все запускалось из IDE.

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


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

Запускал свои прогрммки (OpenCV 1.1pre1, OpenCV 2.0) из C++Builder6, VS2008, VS2005, все запускалось из IDE.

Хм. Дело в ошибке, а не в листинге. Проект - совершенно любой, а исключение возникает в строчке VI.setupDevice(index) в функции bool CvCaptureCAM_DShow::open( int _index ) модуля cvcap_dshow.cpp. Уж если вы так хотите, пожалуйста. Внизу - четыре примера (три закомментировано, но тоже работали, то есть не работали).

//#include "stdafx.h"

//#include "highgui.h"

//int main (int argc, char** argv)

//{

//IplImage* img = cvLoadImage( argv[1] );

//cvNamedWindow( "Example1", CV_WINDOW_AUTOSIZE);

//cvShowImage( "Example1", img );

//cvWaitKey(0);

//cvReleaseImage( &img );

//cvDestroyWindow( "Example1" );

//}



/*

#include "stdafx.h"  

#include <cv.h>  

#include <cxcore.h>  

#include <highgui.h>  

#include <iostream>  

using namespace std;  


void processFrame(IplImage*& image);  


int main(int argc, char** argv)   

{  

 // Инициализируем источник наших изображений.  

 // В данном случае - это видеокамера, подключенная по   

 // одному из интерфейсов. 0 означает, что надо  

 // выбрать первую попавшуюся камеру. У нас их одна,  

 // поэтому не стоит волноваться по этому поводу 

 CvCapture* capture = 0;  

 capture = cvCreateCameraCapture(0);  

 if (!capture)  

 {  

  cout << "Initialization failed" << endl;  

  return EXIT_FAILURE;  

 }  


 // Работа с GUI упрощена до невозможного. Необходимо  

 // определить идентификатор (по совместительству -  

 // заголовок окна), по которому мы будем определять  

 // наши окна.  

 const char *windowName = "First steps with OpenCV";  

 cvNamedWindow(windowName, CV_WINDOW_AUTOSIZE);  


 while(true)   

 {  

  // Опрашиваем камеру для получения следующего кадра  

  IplImage* frame = cvQueryFrame( capture );  

  if(!frame)   

   break;  


  // processFrame(frame);  


  // Отобразим наш фрейм в окне (не забыли, как мы его  

  // определили? - через идентификатор)  

  cvShowImage(windowName, frame);  


  // По нажатию ESC - выход из цикла  

  char c = cvWaitKey(33);  

  if (c == 27)   

   break;  

 }  


 // Никогда не забываем освобождать память!  

 cvReleaseCapture( &capture );  

 cvDestroyWindow(windowName);  

 return 0;  

}  

*/


#include <windows.h>


#include "stdafx.h"  

#include <cv.h>  

#include <cxcore.h>  

#include <highgui.h>  

#include <iostream>  


#include "cv.h"

#include "highgui.h"


using namespace std;  


float edge_thresh=50;



#define WIDTHBYTES(bits) ((((bits) + 31) / 32) * 4)

//---------------------------------------------------------------------------

// Создание API шного битмапа из интеловского RGB изображения

//---------------------------------------------------------------------------

HBITMAP CreateRGBBitmap(IplImage* _Grab)

		 {

char *App;

			 LPBITMAPINFO lpbi = new BITMAPINFO;

			 lpbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);

			 lpbi->bmiHeader.biWidth = _Grab->width;

			 lpbi->bmiHeader.biHeight =_Grab->height;

			 lpbi->bmiHeader.biPlanes = 1;

			 lpbi->bmiHeader.biBitCount = 24;

			 lpbi->bmiHeader.biCompression = BI_RGB;

			 lpbi->bmiHeader.biSizeImage = WIDTHBYTES((DWORD)_Grab->width * 8) * _Grab->height;

			 lpbi->bmiHeader.biXPelsPerMeter = 0;

			 lpbi->bmiHeader.biYPelsPerMeter = 0;

			 lpbi->bmiHeader.biClrUsed = 0;

			 lpbi->bmiHeader.biClrImportant = 0;

			 void* pBits;

			 HBITMAP hBitmap = CreateDIBSection(

				 NULL,

				 lpbi,

				 DIB_RGB_COLORS,

				 (void **)&pBits,

				 NULL,

				 0 );

			 delete lpbi;

			 if ( hBitmap )

App=(char*)pBits;

long int length=0;

if(_Grab->nChannels==1) // Серое или бинарное

  {

length = _Grab->width*(_Grab->height);


for (int i=0;i<_Grab->height;i++)

{

 for (int j=0;j<_Grab->width;j++)

 {

  App[_Grab->width*3*(_Grab->height-i-1)+j*3]=_Grab->imageData[_Grab->width*(i)+j];

  App[_Grab->width*3*(_Grab->height-i-1)+j*3+1]=_Grab->imageData[_Grab->width*(i)+j];

  App[_Grab->width*3*(_Grab->height-i-1)+j*3+2]=_Grab->imageData[_Grab->width*(i)+j];

 }

}

  }

if(_Grab->nChannels==3) // Цветное

  {

for (int i=0;i<_Grab->height;i++)

{

// Копируем строчку за строчкой (переворачивая вверх ногами)

memcpy(App+_Grab->width*3*(_Grab->height-i-1),_Grab->imageData+_Grab->width*3*i,_Grab->width*3);

}

  }

return hBitmap;

		 }



//---------------------------------------------------------------------------

//---------------------------------------------------------------------------

// Функция вывода изображения на HANDLE оконного компонента

//---------------------------------------------------------------------------

void  APIDrawIpl(int x,int y,IplImage* _Grab,void *HANDLE)

{

HDC hMemDC,hDC;

hDC=GetDC((HWND)HANDLE);

hMemDC = CreateCompatibleDC(hDC);

HBITMAP Bitmap=CreateRGBBitmap(_Grab);

SelectObject(hMemDC,Bitmap);

BitBlt(hDC,x,y,_Grab->width,_Grab->height,hMemDC,0,0,SRCCOPY);

DeleteObject(Bitmap);

DeleteDC(hMemDC);

DeleteDC(hDC);

}


  IplImage* frame_copy;

  IplImage* gray;


void processFrame(IplImage*& image){

	HBITMAP hBmp = CreateRGBBitmap( image );


	IplImage *Grab = image;


//	GetBitmapBits(


	DeleteObject( hBmp );


	cvSaveImage( "p:\\temp.BMP", image);

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	


		CvSeq* lines;

		CvMemStorage* storage = cvCreateMemStorage(0);

		cvCvtColor(Grab, gray, CV_BGR2GRAY);	  // Получаем серый цвет

		cvSmooth( gray, gray, CV_GAUSSIAN, 9, 9 ); // сгладим, чтобы уменьшить помехи

cvThreshold( gray, gray, edge_thresh,255,/*CV_THRESH_BINARY_INV*/CV_THRESH_BINARY);


// Нах. границы

cvCanny( gray, gray, 20, 1, 3 );

// Собственно здесь линии и выделяются

		lines = cvHoughLines2( gray, storage, CV_HOUGH_PROBABILISTIC, 2, CV_PI/180, 20, 10, 5 );

		for(int i = 0; i < lines->total; i++ )

		{

			CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i);


			cvLine( Grab, line[0], line[1], CV_RGB(255,0,0), 1, 8 );

		}


cvReleaseMemStorage(&storage);


APIDrawIpl(10,10,Grab, GetForegroundWindow() );		  // Рисуем результат

APIDrawIpl(Grab->width+10,10,gray, GetForegroundWindow() );		  // Рисуем результат


	//CloseHandle( hBmp ); 

};




int main(int argc, char** argv)   

{  

 // Инициализируем источник наших изображений.  

 // В данном случае - это видеокамера, подключенная по   

 // одному из интерфейсов. 0 означает, что надо  

 // выбрать первую попавшуюся камеру. У нас их одна,  

 // поэтому не стоит волноваться по этому поводу 

 CvCapture* capture = 0;  

 capture = cvCreateCameraCapture(0);  

 if (!capture)  

 {  

  cout << "Initialization failed" << endl;  

  return EXIT_FAILURE;  

 }  


 // Работа с GUI упрощена до невозможного. Необходимо  

 // определить идентификатор (по совместительству -  

 // заголовок окна), по которому мы будем определять  

 // наши окна.  

 const char *windowName = "First steps with OpenCV";  

 cvNamedWindow(windowName, CV_WINDOW_AUTOSIZE);  


 while(true)   

 {  

  // Опрашиваем камеру для получения следующего кадра  

  IplImage* frame = cvQueryFrame( capture );  



  if(!frame)   

   break;  

// Даем приказ на захват кадра

			if( !cvGrabFrame( capture ))

				goto skip;

// Если удачно - получаем кадр

			frame = cvRetrieveFrame( capture );

			if( !frame )

// Если захват не удался - пропускаем дальнейшее 

				goto skip;

// Выделяем память под копию кадра

			if( !frame_copy )

				frame_copy = cvCreateImage( cvSize(frame->width,frame->height),

											IPL_DEPTH_8U, frame->nChannels );


// Выделяем память под серую копию кадра

			if( !gray )

				gray = cvCreateImage( cvSize(frame->width,frame->height),

											IPL_DEPTH_8U,1);

//*********************************************************

// Если стерли то что ниже - это надо раскомментировать

//				frame_copy = cvCreateImage( cvSize(frame->width,frame->height),

//											IPL_DEPTH_8U, frame->nChannels );

// Делаем копию кадра, иначе может пропасть.

//			cvCopy( frame, frame_copy, 0 );

// Если стерли то что ниже - это надо раскомментировать

//*********************************************************


//*********************************************************

// Если не нужно подгонять размер кадра - это можно стереть

// Выделяем память под копию кадра

			if( !frame_copy )

				frame_copy = cvCreateImage( cvSize(352,288),

											IPL_DEPTH_8U, frame->nChannels );

// Масштабируем под заданный размер

cvResize( frame, frame_copy, CV_INTER_LINEAR );

// Если не нужно подгонять размер кадра - это можно стереть

//*********************************************************


// Обработка полученного кадра

			processFrame( frame_copy );


//  processFrame(frame);  


/*

	IplImage* buf = cvCreateImage( cvSize(640,480), 8, 4);

	if(!buf) abort();	


	cvCopyImage(frame,buf);


	cvSmooth(buf,buf);

*/	

	// Отобразим наш фрейм в окне (не забыли, как мы его  

	// определили? - через идентификатор)  

	// cvShowImage(windowName, frame);  

/*	

	cvShowImage(windowName, buf);  


//	cvReleaseImage(&buf);   

*/

skip:




  // По нажатию ESC - выход из цикла  

  char c = cvWaitKey(33);  

  if (c == 27)   

   break;  

 }  


 // Никогда не забываем освобождать память!  

 cvReleaseCapture( &capture );  

 cvDestroyWindow(windowName);  

 return 0;  

}[/code]

P.S. Исключение только в самом первом консольном примере (закомментированном палочками //) - там исключение не возникает.

P.P.S. Конечно, спасибо вам за ваш забавный пример HoughLines.rar. :)

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


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

Запустил, пример у себя на vs2008 , тоже не работает, но камеру включил (и мертво зависло приложение, так что не снять :) ). Будем копать, может найдется решение.

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×