Хм. Дело в ошибке, а не в листинге. Проект - совершенно любой, а исключение возникает в строчке 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.