Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
O
opencv
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
opencv
Commits
2b29db86
Commit
2b29db86
authored
Apr 12, 2016
by
Alexander Alekhin
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #6391 from virtuald:v4l-device-name
parents
2f0676fb
e489f29d
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
81 additions
and
34 deletions
+81
-34
cap.cpp
modules/videoio/src/cap.cpp
+5
-0
cap_libv4l.cpp
modules/videoio/src/cap_libv4l.cpp
+41
-15
cap_v4l.cpp
modules/videoio/src/cap_v4l.cpp
+34
-19
precomp.hpp
modules/videoio/src/precomp.hpp
+1
-0
No files found.
modules/videoio/src/cap.cpp
View file @
2b29db86
...
...
@@ -292,6 +292,11 @@ CV_IMPL CvCapture * cvCreateFileCaptureWithPreference (const char * filename, in
result
=
cvCreateFileCapture_VFW
(
filename
);
if
(
apiPreference
)
break
;
#endif
#if defined HAVE_LIBV4L || defined HAVE_CAMV4L || defined HAVE_CAMV4L2 || defined HAVE_VIDEOIO
if
(
!
result
)
result
=
cvCreateCameraCapture_V4L
(
filename
);
if
(
apiPreference
)
break
;
#endif
case
CV_CAP_MSMF
:
#ifdef HAVE_MSMF
...
...
modules/videoio/src/cap_libv4l.cpp
View file @
2b29db86
...
...
@@ -350,6 +350,7 @@ typedef struct CvCaptureCAM_V4L
}
CvCaptureCAM_V4L
;
static
CvCaptureCAM_V4L
*
icvCaptureFromCAM_V4L
(
const
char
*
deviceName
);
static
void
icvCloseCAM_V4L
(
CvCaptureCAM_V4L
*
capture
);
static
int
icvGrabFrameCAM_V4L
(
CvCaptureCAM_V4L
*
capture
);
...
...
@@ -416,7 +417,7 @@ static void icvInitCapture_V4L() {
};
/* End icvInitCapture_V4L */
static
int
try_init_v4l
(
CvCaptureCAM_V4L
*
capture
,
char
*
deviceName
)
static
int
try_init_v4l
(
CvCaptureCAM_V4L
*
capture
,
c
onst
c
har
*
deviceName
)
{
...
...
@@ -460,7 +461,7 @@ static int try_init_v4l(CvCaptureCAM_V4L* capture, char *deviceName)
}
static
int
try_init_v4l2
(
CvCaptureCAM_V4L
*
capture
,
char
*
deviceName
)
static
int
try_init_v4l2
(
CvCaptureCAM_V4L
*
capture
,
c
onst
c
har
*
deviceName
)
{
// if detect = -1 then unable to open device
...
...
@@ -662,7 +663,7 @@ static inline int channels_for_mode(int mode)
}
}
static
int
_capture_V4L2
(
CvCaptureCAM_V4L
*
capture
,
char
*
deviceName
)
static
int
_capture_V4L2
(
CvCaptureCAM_V4L
*
capture
,
c
onst
c
har
*
deviceName
)
{
int
detect_v4l2
=
0
;
...
...
@@ -870,7 +871,7 @@ static int _capture_V4L2 (CvCaptureCAM_V4L *capture, char *deviceName)
};
/* End _capture_V4L2 */
static
int
_capture_V4L
(
CvCaptureCAM_V4L
*
capture
,
char
*
deviceName
)
static
int
_capture_V4L
(
CvCaptureCAM_V4L
*
capture
,
c
onst
c
har
*
deviceName
)
{
int
detect_v4l
=
0
;
...
...
@@ -1041,17 +1042,6 @@ static CvCaptureCAM_V4L * icvCaptureFromCAM_V4L (int index)
fprintf
(
stderr
,
"VIDEOIO ERROR: V4L: index %d is not correct!
\n
"
,
index
);
return
NULL
;
/* Did someone ask for not correct video source number? */
}
/* Allocate memory for this humongus CvCaptureCAM_V4L structure that contains ALL
the handles for V4L processing */
CvCaptureCAM_V4L
*
capture
=
(
CvCaptureCAM_V4L
*
)
cvAlloc
(
sizeof
(
CvCaptureCAM_V4L
));
if
(
!
capture
)
{
fprintf
(
stderr
,
"VIDEOIO ERROR: V4L: Could not allocate memory for capture process.
\n
"
);
return
NULL
;
}
#ifdef USE_TEMP_BUFFER
capture
->
buffers
[
MAX_V4L_BUFFERS
].
start
=
NULL
;
#endif
/* Select camera, or rather, V4L video source */
if
(
index
<
0
)
{
// Asking for the first device available
...
...
@@ -1065,9 +1055,26 @@ static CvCaptureCAM_V4L * icvCaptureFromCAM_V4L (int index)
}
/* Print the CameraNumber at the end of the string with a width of one character */
sprintf
(
deviceName
,
"/dev/video%1d"
,
index
);
return
icvCaptureFromCAM_V4L
(
deviceName
);
}
static
CvCaptureCAM_V4L
*
icvCaptureFromCAM_V4L
(
const
char
*
deviceName
)
{
/* Allocate memory for this humongus CvCaptureCAM_V4L structure that contains ALL
the handles for V4L processing */
CvCaptureCAM_V4L
*
capture
=
(
CvCaptureCAM_V4L
*
)
cvAlloc
(
sizeof
(
CvCaptureCAM_V4L
));
if
(
!
capture
)
{
fprintf
(
stderr
,
"VIDEOIO ERROR: V4L: Could not allocate memory for capture process.
\n
"
);
return
NULL
;
}
#ifdef USE_TEMP_BUFFER
capture
->
buffers
[
MAX_V4L_BUFFERS
].
start
=
NULL
;
#endif
/* w/o memset some parts arent initialized - AKA: Fill it with zeros so it is clean */
memset
(
capture
,
0
,
sizeof
(
CvCaptureCAM_V4L
));
/* Present the routines needed for V4L funtionality. They are inserted as part of
the standard set of cv calls promoting transparency. "Vector Table" insertion. */
capture
->
FirstCapture
=
1
;
...
...
@@ -1909,6 +1916,7 @@ public:
virtual
~
CvCaptureCAM_V4L_CPP
()
{
close
();
}
virtual
bool
open
(
int
index
);
virtual
bool
open
(
const
char
*
deviceName
);
virtual
void
close
();
virtual
double
getProperty
(
int
)
const
;
...
...
@@ -1927,6 +1935,13 @@ bool CvCaptureCAM_V4L_CPP::open( int index )
return
captureV4L
!=
0
;
}
bool
CvCaptureCAM_V4L_CPP
::
open
(
const
char
*
deviceName
)
{
close
();
captureV4L
=
icvCaptureFromCAM_V4L
(
deviceName
);
return
captureV4L
!=
0
;
}
void
CvCaptureCAM_V4L_CPP
::
close
()
{
if
(
captureV4L
)
...
...
@@ -1967,4 +1982,15 @@ CvCapture* cvCreateCameraCapture_V4L( int index )
return
0
;
}
CvCapture
*
cvCreateCameraCapture_V4L
(
const
char
*
deviceName
)
{
CvCaptureCAM_V4L_CPP
*
capture
=
new
CvCaptureCAM_V4L_CPP
;
if
(
capture
->
open
(
deviceName
))
return
(
CvCapture
*
)
capture
;
delete
capture
;
return
0
;
}
#endif
modules/videoio/src/cap_v4l.cpp
View file @
2b29db86
...
...
@@ -270,12 +270,12 @@ struct CvCaptureCAM_V4L : public CvCapture
int
deviceHandle
;
int
bufferIndex
;
int
FirstCapture
;
String
deviceName
;
char
*
memoryMap
;
IplImage
frame
;
__u32
palette
;
int
index
;
int
width
,
height
;
__u32
fps
;
bool
convert_rgb
;
...
...
@@ -298,6 +298,7 @@ struct CvCaptureCAM_V4L : public CvCapture
Range
focus
,
brightness
,
contrast
,
saturation
,
hue
,
gain
,
exposure
;
bool
open
(
int
_index
);
bool
open
(
const
char
*
deviceName
);
virtual
double
getProperty
(
int
)
const
;
virtual
bool
setProperty
(
int
,
double
);
...
...
@@ -392,7 +393,7 @@ static bool try_palette_v4l2(CvCaptureCAM_V4L* capture)
return
capture
->
palette
==
capture
->
form
.
fmt
.
pix
.
pixelformat
;
}
static
int
try_init_v4l2
(
CvCaptureCAM_V4L
*
capture
,
char
*
deviceName
)
static
int
try_init_v4l2
(
CvCaptureCAM_V4L
*
capture
,
c
onst
c
har
*
deviceName
)
{
// Test device for V4L2 compability
// Return value:
...
...
@@ -600,10 +601,7 @@ static void v4l2_create_frame(CvCaptureCAM_V4L *capture) {
static
int
_capture_V4L2
(
CvCaptureCAM_V4L
*
capture
)
{
char
deviceName
[
MAX_DEVICE_DRIVER_NAME
];
/* Print the CameraNumber at the end of the string with a width of one character */
sprintf
(
deviceName
,
"/dev/video%1d"
,
capture
->
index
);
const
char
*
deviceName
=
capture
->
deviceName
.
c_str
();
if
(
try_init_v4l2
(
capture
,
deviceName
)
!=
1
)
{
/* init of the v4l2 device is not OK */
return
-
1
;
...
...
@@ -761,17 +759,16 @@ static int _capture_V4L2 (CvCaptureCAM_V4L *capture)
* this also causes buffers to be reallocated if the frame size was changed.
*/
static
bool
v4l2_reset
(
CvCaptureCAM_V4L
*
capture
)
{
int
index
=
capture
->
index
;
String
deviceName
=
capture
->
deviceName
;
icvCloseCAM_V4L
(
capture
);
capture
->
index
=
index
;
capture
->
deviceName
=
deviceName
;
return
_capture_V4L2
(
capture
)
==
1
;
}
bool
CvCaptureCAM_V4L
::
open
(
int
_index
)
{
int
autoindex
=
0
;
index
=
-
1
;
// set the capture to closed state
char
_deviceName
[
MAX_DEVICE_DRIVER_NAME
];
if
(
!
numCameras
)
icvInitCapture_V4L
();
/* Havent called icvInitCapture yet - do it now! */
...
...
@@ -796,14 +793,21 @@ bool CvCaptureCAM_V4L::open(int _index)
autoindex
++
;
// i can recall icvOpenCAM_V4l with index=-1 for next camera
}
index
=
_index
;
FirstCapture
=
1
;
width
=
DEFAULT_V4L_WIDTH
;
height
=
DEFAULT_V4L_HEIGHT
;
fps
=
DEFAULT_V4L_FPS
;
convert_rgb
=
true
;
/* Print the CameraNumber at the end of the string with a width of one character */
sprintf
(
_deviceName
,
"/dev/video%1d"
,
_index
);
return
open
(
_deviceName
);
}
return
_capture_V4L2
(
this
)
==
1
;
bool
CvCaptureCAM_V4L
::
open
(
const
char
*
_deviceName
)
{
FirstCapture
=
1
;
width
=
DEFAULT_V4L_WIDTH
;
height
=
DEFAULT_V4L_HEIGHT
;
fps
=
DEFAULT_V4L_FPS
;
convert_rgb
=
true
;
deviceName
=
_deviceName
;
return
_capture_V4L2
(
this
)
==
1
;
}
static
int
read_frame_v4l2
(
CvCaptureCAM_V4L
*
capture
)
{
...
...
@@ -1758,7 +1762,7 @@ static int icvSetPropertyCAM_V4L( CvCaptureCAM_V4L* capture,
static
void
icvCloseCAM_V4L
(
CvCaptureCAM_V4L
*
capture
){
/* Deallocate space - Hopefully, no leaks */
if
(
capture
->
index
>
-
1
)
if
(
!
capture
->
deviceName
.
empty
()
)
{
if
(
capture
->
deviceHandle
!=
-
1
)
{
...
...
@@ -1787,7 +1791,7 @@ static void icvCloseCAM_V4L( CvCaptureCAM_V4L* capture ){
if
(
capture
->
frame
.
imageData
)
cvFree
(
&
capture
->
frame
.
imageData
);
capture
->
index
=
-
1
;
// flag that the capture is closed
capture
->
deviceName
.
clear
()
;
// flag that the capture is closed
}
};
...
...
@@ -1824,4 +1828,15 @@ CvCapture* cvCreateCameraCapture_V4L( int index )
return
NULL
;
}
CvCapture
*
cvCreateCameraCapture_V4L
(
const
char
*
deviceName
)
{
cv
::
CvCaptureCAM_V4L
*
capture
=
new
cv
::
CvCaptureCAM_V4L
();
if
(
capture
->
open
(
deviceName
))
return
capture
;
delete
capture
;
return
NULL
;
}
#endif
modules/videoio/src/precomp.hpp
View file @
2b29db86
...
...
@@ -102,6 +102,7 @@ struct CvVideoWriter
};
CvCapture
*
cvCreateCameraCapture_V4L
(
int
index
);
CvCapture
*
cvCreateCameraCapture_V4L
(
const
char
*
deviceName
);
CvCapture
*
cvCreateCameraCapture_DC1394
(
int
index
);
CvCapture
*
cvCreateCameraCapture_DC1394_2
(
int
index
);
CvCapture
*
cvCreateCameraCapture_MIL
(
int
index
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment