Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Увеличение разрешения захвата камеры в OpenCV
В моей программе C/C++ я использую OpenCV для захвата изображений из моего webcam. Камера (Logitech QuickCam IM) может снимать в разрешениях 320x240 , 640x480 и 1280x960 . Но, по какой-то странной причине, OpenCV дает мне изображения только с разрешением 320x240 . Вызовы для изменения разрешения с помощью cvSetCaptureProperty() с другими значениями разрешения просто не работают. Как я могу снимать изображения с другими разрешениями, возможными с помощью my webcam?
Я использую openCV 1.1pre1 под Windows (библиотека videoinput используется по умолчанию этой версией openCv под windows).
С помощью этих инструкций я могу установить разрешение камеры. Обратите внимание, что я называю старый cvCreateCameraCapture вместо cvCaptureFromCam.
capture = cvCreateCameraCapture(cameraIndex);
cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH, 640 );
cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT, 480 );
videoFrame = cvQueryFrame(capture);
Я протестировал его с веб-камерами Logitech, Trust и Philips
Похоже, что здесь нет никакого решения. Разрешение может быть увеличено до 640x480 , используя этот хак , разделяемый lifebelt77 . Вот какие детали воспроизводятся:
Добавить к highgui.h :
#define CV_CAP_PROP_DIALOG_DISPLAY 8
#define CV_CAP_PROP_DIALOG_FORMAT 9
#define CV_CAP_PROP_DIALOG_SOURCE 10
#define CV_CAP_PROP_DIALOG_COMPRESSION 11
#define CV_CAP_PROP_FRAME_WIDTH_HEIGHT 12
Добавьте функцию icvSetPropertyCAM_VFW в cvcap.cpp :
static int icvSetPropertyCAM_VFW( CvCaptureCAM_VFW* capture, int property_id, double value )
{
int result = -1;
CAPSTATUS capstat;
CAPTUREPARMS capparam;
BITMAPINFO btmp;
switch( property_id )
{
case CV_CAP_PROP_DIALOG_DISPLAY:
result = capDlgVideoDisplay(capture->capWnd);
//SendMessage(capture->capWnd,WM_CAP_DLG_VIDEODISPLAY,0,0);
break;
case CV_CAP_PROP_DIALOG_FORMAT:
result = capDlgVideoFormat(capture->capWnd);
//SendMessage(capture->capWnd,WM_CAP_DLG_VIDEOFORMAT,0,0);
break;
case CV_CAP_PROP_DIALOG_SOURCE:
result = capDlgVideoSource(capture->capWnd);
//SendMessage(capture->capWnd,WM_CAP_DLG_VIDEOSOURCE,0,0);
break;
case CV_CAP_PROP_DIALOG_COMPRESSION:
result = capDlgVideoCompression(capture->capWnd);
break;
case CV_CAP_PROP_FRAME_WIDTH_HEIGHT:
capGetVideoFormat(capture->capWnd, &btmp, sizeof(BITMAPINFO));
btmp.bmiHeader.biWidth = floor(value/1000);
btmp.bmiHeader.biHeight = value-floor(value/1000)*1000;
btmp.bmiHeader.biSizeImage = btmp.bmiHeader.biHeight *
btmp.bmiHeader.biWidth * btmp.bmiHeader.biPlanes *
btmp.bmiHeader.biBitCount / 8;
capSetVideoFormat(capture->capWnd, &btmp, sizeof(BITMAPINFO));
break;
default:
break;
}
return result;
}
и отредактируйте captureCAM_VFW_vtable следующим образом:
static CvCaptureVTable captureCAM_VFW_vtable =
{
6,
(CvCaptureCloseFunc)icvCloseCAM_VFW,
(CvCaptureGrabFrameFunc)icvGrabFrameCAM_VFW,
(CvCaptureRetrieveFrameFunc)icvRetrieveFrameCAM_VFW,
(CvCaptureGetPropertyFunc)icvGetPropertyCAM_VFW,
(CvCaptureSetPropertyFunc)icvSetPropertyCAM_VFW, // was NULL
(CvCaptureGetDescriptionFunc)0
};
Теперь перестроен highgui.dll .
Проверьте этот билет: https://code.ros.org/trac/opencv/ticket/376
"Решение заключается в использовании более новой оболочки на основе libv4l.
установите libv4l-dev (так он называется в Ubuntu)
повторите cmake, вы увидите "V4L/V4L2: с помощью libv4l"
повтор сделать. теперь разрешение может быть изменено. проверено с помощью встроенного isight на MBP."
Это исправило его для меня с помощью Ubuntu и может также работать для вас.
Я уже делал обработку изображений в linux раньше и пропустил встроенные функции камеры OpenCV, потому что они (как вы обнаружили) неполные.
В зависимости от вашего OS вы можете иметь больше удачи, идя прямо к аппаратному обеспечению через обычные каналы, а не через openCV. Если вы используете Linux, video4linux или video4linux2 должны предоставить вам относительно тривиальный доступ к веб-камерам USB, и вы можете использовать libavc1394 для firewire. В зависимости от устройства и качества кода примера, которому вы следуете, вы должны быть в состоянии запустить устройство с нужными параметрами в течение часа или двух.
Отредактировано, чтобы добавить: Вы сами по себе, если его Windows. Я думаю, что это не намного сложнее, но я никогда не делал этого.
Я настоятельно рекомендую использовать VideoInput lib , он поддерживает любое устройство DirectShow (даже несколько устройств одновременно) и является более настраиваемым. Вы потратите пять минут, чтобы заставить его играть с OpenCV.
Код, который я наконец получил, работая в Python, как только Аарон Хаун указал, что мне нужно определить аргументы функции set перед их использованием.
#Camera_Get_Set.py
#By Forrest L. Erickson of VRX Company Inc. 8-31-12.
#Opens the camera and reads and reports the settings.
#Then tries to set for higher resolution.
#Workes with Logitech C525 for resolutions 960 by 720 and 1600 by 896
import cv2.cv as cv
import numpy
CV_CAP_PROP_POS_MSEC = 0
CV_CAP_PROP_POS_FRAMES = 1
CV_CAP_PROP_POS_AVI_RATIO = 2
CV_CAP_PROP_FRAME_WIDTH = 3
CV_CAP_PROP_FRAME_HEIGHT = 4
CV_CAP_PROP_FPS = 5
CV_CAP_PROP_POS_FOURCC = 6
CV_CAP_PROP_POS_FRAME_COUNT = 7
CV_CAP_PROP_BRIGHTNESS = 8
CV_CAP_PROP_CONTRAST = 9
CV_CAP_PROP_SATURATION = 10
CV_CAP_PROP_HUE = 11
CV_CAPTURE_PROPERTIES = tuple({
CV_CAP_PROP_POS_MSEC,
CV_CAP_PROP_POS_FRAMES,
CV_CAP_PROP_POS_AVI_RATIO,
CV_CAP_PROP_FRAME_WIDTH,
CV_CAP_PROP_FRAME_HEIGHT,
CV_CAP_PROP_FPS,
CV_CAP_PROP_POS_FOURCC,
CV_CAP_PROP_POS_FRAME_COUNT,
CV_CAP_PROP_BRIGHTNESS,
CV_CAP_PROP_CONTRAST,
CV_CAP_PROP_SATURATION,
CV_CAP_PROP_HUE})
CV_CAPTURE_PROPERTIES_NAMES = [
"CV_CAP_PROP_POS_MSEC",
"CV_CAP_PROP_POS_FRAMES",
"CV_CAP_PROP_POS_AVI_RATIO",
"CV_CAP_PROP_FRAME_WIDTH",
"CV_CAP_PROP_FRAME_HEIGHT",
"CV_CAP_PROP_FPS",
"CV_CAP_PROP_POS_FOURCC",
"CV_CAP_PROP_POS_FRAME_COUNT",
"CV_CAP_PROP_BRIGHTNESS",
"CV_CAP_PROP_CONTRAST",
"CV_CAP_PROP_SATURATION",
"CV_CAP_PROP_HUE"]
capture = cv.CaptureFromCAM(0)
print ("\nCamera properties before query of frame.")
for i in range(len(CV_CAPTURE_PROPERTIES_NAMES)):
# camera_valeus =[CV_CAPTURE_PROPERTIES_NAMES, foo]
foo = cv.GetCaptureProperty(capture, CV_CAPTURE_PROPERTIES[i])
camera_values =[CV_CAPTURE_PROPERTIES_NAMES[i], foo]
# print str(camera_values)
print str(CV_CAPTURE_PROPERTIES_NAMES[i]) + ": " + str(foo)
print ("\nOpen a window for display of image")
cv.NamedWindow("Camera", 1)
while True:
img = cv.QueryFrame(capture)
cv.ShowImage("Camera", img)
if cv.WaitKey(10) == 27:
break
cv.DestroyWindow("Camera")
#cv.SetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 1024)
#cv.SetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 768)
cv.SetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 1600)
cv.SetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 896)
print ("\nCamera properties after query and display of frame.")
for i in range(len(CV_CAPTURE_PROPERTIES_NAMES)):
# camera_valeus =[CV_CAPTURE_PROPERTIES_NAMES, foo]
foo = cv.GetCaptureProperty(capture, CV_CAPTURE_PROPERTIES[i])
camera_values =[CV_CAPTURE_PROPERTIES_NAMES[i], foo]
# print str(camera_values)
print str(CV_CAPTURE_PROPERTIES_NAMES[i]) + ": " + str(foo)
print ("/nOpen a window for display of image")
cv.NamedWindow("Camera", 1)
while True:
img = cv.QueryFrame(capture)
cv.ShowImage("Camera", img)
if cv.WaitKey(10) == 27:
break
cv.DestroyWindow("Camera")
Я публикую это, чтобы убедиться, что никто больше не тратит время на эту функцию setproperty. Я потратил на это 2 дня, чтобы убедиться, что ничего не работает. Поэтому я откопал код (я установил библиотеку в первый раз). Именно это и происходит на самом деле-cvSetCaptureProperty, вызывает setProperty внутри CvCapture класса и глядь setProperty ничего не делает. Он просто возвращает false. Вместо этого я буду использовать другую библиотеку, чтобы передать OpenCV захват video/images. я использую OpenCV 2.2
Я нахожу, что в Windows (от Win98 до WinXP SP3) OpenCV часто использует библиотеку Microsoft VFW для доступа к камере. Проблема с этим заключается в том, что он часто очень медленный (скажем, максимум 15 FPS кадра захвата) и глючит (следовательно, почему cvSetCaptureProperty часто не работает). К счастью, вы обычно можете изменить разрешение в другом программном обеспечении (особенно "AMCAP", которое является демонстрационной программой, которая легко доступна), и это повлияет на разрешение, которое будет использовать OpenCV. Например, вы можете запустить AMCAP, чтобы установить разрешение 640x480, а затем OpenCV будет использовать его по умолчанию с этого момента!
Но если вы можете использовать другую библиотеку доступа к камере Windows, такую как библиотека "videoInput" http://muonics.net/school/spring05/videoInput/ , которая обращается к камере с помощью очень эффективного DirectShow (часть DirectX). Или если у вас есть профессиональная качественная камера, то часто она поставляется с пользовательской API, которая позволяет вам получить доступ к камере, и вы можете использовать ее для быстрого доступа с возможностью изменения разрешения и многих других вещей.
В разделе Windows попробуйте использовать библиотеку VideoInput: http://robocraft.ru/blog/computervision/420.html
Если вы находитесь на платформе windows, попробуйте DirectShow (IAMStreamConfig).
http://msdn.microsoft.com/en-us/library/dd319784%28в=vs.85%29.aspx
Только одна информация, которая может быть полезной для людей, испытывающих трудности с изменением разрешения захвата по умолчанию (640 x 480)! Я сам экспериментировал с такой проблемой с opencv 2.4.x и одной камерой Logitech ... и нашел один обходной путь !
Поведение, которое я обнаружил, заключается в том, что формат по умолчанию устанавливается в качестве начальных параметров при запуске захвата камеры (cvCreateCameraCapture), и все запросы на изменение высоты или ширины :
cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH, ...
или
cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT, ...
после этого это невозможно ! Фактически, я обнаружил с добавлением ошибки возврата функций ioctl, что драйвер V4l2 возвращает EBUSY для запросов thet ! Поэтому одним из обходных путей должно быть изменение значения по умолчанию непосредственно в highgui/cap_v4l.cpp :
*#define DEFAULT_V4L_WIDTH 1280 // Originally 640*
*#define DEFAULT_V4L_HEIGHT 720 // Originally 480*
После этого я просто перекомпилировал opencv ... и прибыл, чтобы получить 1280 x 720 без каких-либо проблем ! Конечно, лучше всего было бы остановить приобретение, изменить параметры и перезапустить поток после этого, но я недостаточно знаком с opencv для этого !
Надеюсь, это поможет.
Мишель BEGEY