2010-12-13 3 views
9

Я установил OpenCV 2.2, и теперь я не могу заставить захват веб-камеры работать. Он работал нормально в 2.1. OpenCV обнаруживает веб-камеру, не сообщает о каких-либо ошибках или предупреждениях, но каждый кадр представляет собой серое изображение. Я даже попробовал образец кода из OpenCV wiki:Проблема с захватом веб-камеры OpenCV

VideoCapture cap(0); // open the default camera 
if(!cap.isOpened()) // check if we succeeded 
    return -1; 

Mat edges; 
namedWindow("edges",1); 
for(;;) 
{ 
    Mat frame; 
    cap >> frame; // get a new frame from camera 
    cvtColor(frame, edges, CV_BGR2GRAY); 
    //GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5); 
    //Canny(edges, edges, 0, 30, 3); 
    imshow("edges", edges); 
    if(waitKey(30) >= 0) break; 
} 
// the camera will be deinitialized automatically in VideoCapture destructor 
return 0; 

Кто-нибудь сталкивался с этой проблемой? Я использую 64-битные Win7 и Visual Studio 2010.

+2

Что вы имеете в виду под " серое изображение "? Твердо серый, без структуры? Или просто изображение в оттенках серого? Вы вызываете cvtColor() в оттенки серого изображения, а вызов imshow() показывает версию в градациях серого ... – jtdubs

+0

Твердый серый, а не оттенки серого. – Figaro

+0

Иногда этот ib немного медленный. Добавьте 'sleep (1)' или 'cv :: waitKey (100)' перед краем Mat и добавьте то же самое внутри цикла for. Это должно сработать. И не забудьте chekc, если «frame» - это изображение prper. – nutario

ответ

1

Я действительно ничего не знаю о OpenCV, но не проблема в следующей строке?

cvtColor(frame, edges, CV_BGR2GRAY); 

Похоже, вы намеренно конвертируете цветовое пространство B-G-R в пространство оттенков серого.

Если это не будет что-то вроде:

cvtColor(frame, edges, CV_BGR2RGB); 
+0

большинство алгоритмов обнаружения края работают только с изображениями в оттенках серого - op отображает изображение в градациях серого вместо исходного цвета –

+0

В этом проблема, если дать мое мнение по вопросу, который я не знаю ... :) Я думал, что проблема было изображение в оттенках серого, а не серое изображение ... Глупо мне. :) – Machado

9

Я нашел решение после очень долгого поиска.

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

Решение помещается cvWaitKey(20); в петлю.

+1

Просто хотел добавить комментарий, что это исправило мою проблему! Спасибо :) – amr

3

Проблема была с камерой, которую я использовал, MSFT LifeCam. Я пробовал Logitech C210 и 120, и оба они отлично работают.

0

Вы также можете посмотреть this post.

Выражаясь просто, изменяя

из

импорт сорта

к

импорта cv2.cv, как сорта

работал для меня. См. Также сообщение here.

3

Решение проблемы.

Каждая захваченная рамка изображения преобразуется в полутоновое изображение в первой строке ниже. Комментируя и запуская только код, вы увидите сообщение об ошибке, так как вы не захватываете обработанное изображение в рамке, которое отображается в imshow.

Поэтому прокомментируйте строку cvtColor и измените второй параметр в imshow на frame. Это позволит вам отображать цветное видео с веб-камеры.

cvtColor(frame, edges, CV_BGR2GRAY); 

imshow("edges", frame); 
0

У меня была та же проблема. Я подумал, что это могут быть настройки на моей камере, потому что у меня должен был быть вход 640x480px (который я не мог настроить), и я не мог настроить разрешения для фида. Поэтому я установил виртуальную веб-камеру, которая в значительной степени разрешила обе проблемы. Я получил диалог ввода, выбрал виртуальную камеру, и она сработала. Мне удалось установить его на 640x480 в приложении.

Моя виртуальная камера была названа ManyCam, но похоже, что она создана для девочек-подростков, хотела, чтобы я установил еще 3 приложения, и я все еще не уверен, что погода не идет с «дополнительными» троянами.

Однако он позволяет регулировать цвета, оттенки, контраст и т. Д. И другие материалы, которые могут потребоваться для тестирования.

+0

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

0

Я использую cvtColor и обнаружил, что

cvtColor(image,image,CV_BGR2RGB); не работает.

Но хорошая новость в том, что это изменение работает!

cvtColor(image,image,**COLOR_BGR2RGB**); 

Также включают в себя:

include opencv2/imgproc/imgproc.hpp 

и в файле .pro библиотека:

-lopencv_imgproc 
0

Попробуйте это:

VideoCapture cap(0); // open the default camera 
if(!cap.isOpened()) // check if we succeeded 
{ 
    cout<<"Cam not captured\n"; 
} 

Mat frame; 
namedWindow("frame"); 
for(;;) 
{ 
    cap >> frame; // get a new frame from camera 
    imshow("frame", frame); 

    if(waitKey(10) >= 0) break; 
} 

return 0;