Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-gpu
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc-gpu
Commits
989cefff
Commit
989cefff
authored
Sep 06, 2006
by
Damien Fouilleul
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
- OpenCV video filter module by Dugal Harris
parent
8dde0ccc
Changes
7
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
961 additions
and
0 deletions
+961
-0
AUTHORS
AUTHORS
+5
-0
THANKS
THANKS
+1
-0
configure.ac
configure.ac
+40
-0
modules/video_filter/Modules.am
modules/video_filter/Modules.am
+2
-0
modules/video_filter/filter_event_info.h
modules/video_filter/filter_event_info.h
+59
-0
modules/video_filter/opencv_example.cpp
modules/video_filter/opencv_example.cpp
+235
-0
modules/video_filter/opencv_wrapper.c
modules/video_filter/opencv_wrapper.c
+619
-0
No files found.
AUTHORS
View file @
989cefff
...
...
@@ -200,6 +200,11 @@ D: XVideo video output
D: Gnome and Gtk+ interface enhancements
S: United Kingdom
N: Dugal Harris
E: dugalh (at) protoclea .dot co dot. za
D: OpenCV video filter
S: South Africa
N: Derk-Jan Hartman
E: hartman@videolan.org
C: hartman
...
...
THANKS
View file @
989cefff
...
...
@@ -77,6 +77,7 @@ Jean-Alexis Montignies <ja at sente.ch> - coreaudio multiple streams fix
Jean-Baptiste Kempf <jb at via dot ecp.fr> - Contrib system upgrade
Jean-Baptiste Le Stang <jp.lestand at lestang.org> - Equalizer-GUI-fixes (OSX)
Jean-Philippe Grimaldi <jeanphi at via.ecp.fr> - bug fixes
Dugal Harris <dugalh at protoclea dot. co dot za > - ActiveX bug fixes
Jean-Pierre Kuypers <Kuypers at sri.ucl.ac.be> - French translation
Jeffrey Baker <jwbaker at acm.org> - port of the ALSA plugin to the ALSA 1.0 API
Jeroen Massar <jeroen at unfix dot org> - IPv6 hostname resolution fix
...
...
configure.ac
View file @
989cefff
...
...
@@ -1143,6 +1143,7 @@ VLC_ADD_PLUGINS([access_http access_mms access_ftp ipv4])
VLC_ADD_PLUGINS([packetizer_mpegvideo packetizer_h264])
VLC_ADD_PLUGINS([packetizer_mpeg4video packetizer_mpeg4audio])
if test "${SYS}" != "mingwce"; then
dnl VLC_ADD_PLUGINS([externrun])
VLC_ADD_PLUGINS([access_fake access_filter_timeshift access_filter_record])
...
...
@@ -1873,6 +1874,45 @@ then
fi
fi
dnl
dnl OpenCV wrapper and example filters
dnl
AC_ARG_ENABLE(opencv,
[ --enable-opencv OpenCV (computer vision) filter (default disabled)])
if test "${enable_opencv}" = "yes" -a "${CXX}" != "";
then
AC_ARG_WITH(opencv-tree,
[ --with-opencv-tree=PATH opencv tree for linking])
if test -n "${with_opencv_tree}"
then
if test "${SYS}" = "mingw32" -o "${SYS}" = "cygwin"
then
AC_MSG_CHECKING(for opencv in ${with_opencv_tree})
if test -f ${with_opencv_tree}/cv/include/cv.h -a -f ${with_opencv_tree}/cxcore/include/cxcore.h \
-a -f ${with_opencv_tree}/cvaux/include/cvaux.h -a -f ${with_opencv_tree}/otherlibs/highgui/highgui.h
then
AC_MSG_RESULT(yes)
VLC_ADD_PLUGINS([opencv_wrapper])
VLC_ADD_LDFLAGS([opencv_wrapper],[-L${with_opencv_tree}/lib -lcv -lcxcore -lcvaux -lhighgui])
VLC_ADD_CFLAGS([opencv_wrapper],[-I${with_opencv_tree}/cv/include -I${with_opencv_tree}/cxcore/include -I${with_opencv_tree}/cvaux/include -I${with_opencv_tree}/otherlibs/highgui])
AC_LANG_PUSH(C++)
VLC_ADD_PLUGINS([opencv_example])
VLC_ADD_LDFLAGS([opencv_example],[-L${with_opencv_tree}/lib -lcv -lcxcore -lcvaux -lhighgui])
VLC_ADD_CXXFLAGS([opencv_example],[-I${with_opencv_tree}/cv/include -I${with_opencv_tree}/cxcore/include -I${with_opencv_tree}/cvaux/include -I${with_opencv_tree}/otherlibs/highgui])
AC_LANG_POP(C++)
else
dnl No opencv could be found, sorry
AC_MSG_RESULT(no)
AC_MSG_ERROR([cannot find opencv in ${with_opencv_tree}])
fi
else
AC_MSG_WARN([--enable-opencv currently only works on windows])
fi
fi
fi
dnl
dnl libsmbclient plugin
dnl
...
...
modules/video_filter/Modules.am
View file @
989cefff
...
...
@@ -21,4 +21,6 @@ SOURCES_wave = wave.c
SOURCES_ripple = ripple.c
SOURCES_psychedelic = psychedelic.c
SOURCES_gradient = gradient.c
SOURCES_opencv_wrapper = opencv_wrapper.c
SOURCES_opencv_example = opencv_example.cpp
noinst_HEADERS = filter_common.h
modules/video_filter/filter_event_info.h
0 → 100644
View file @
989cefff
/*****************************************************************************
* opencv_event_info.h:
*****************************************************************************
* Copyright (C) 2004-2005 the VideoLAN team
* $Id: ???
*
* Authors: Dugal Harris
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#ifndef FILTER_EVENT_INFO_H_
#define FILTER_EVENT_INFO_H_
#define VIDEO_FILTER_EVENT_VARIABLE N_("video-filter-event")
typedef
struct
video_filter_region_info_t
{
int
i_x
;
/* x-coordinate of the left-most rectangle corner[s] */
int
i_y
;
/* y-coordinate of the top-most or bottom-most
rectangle corner[s] */
int
i_width
;
/* width of the rectangle */
int
i_height
;
/* height of the rectangle */
int
i_id
;
int
i_type
;
char
*
p_description
;
float
*
pf_param
;
int
i_param_size
;
}
video_filter_region_info_t
;
typedef
struct
video_filter_event_info_t
{
video_filter_region_info_t
*
p_region
;
int
i_region_size
;
}
video_filter_event_info_t
;
/*class CTest
{
public:
CTest(){i=0;};
void Method(){i=0;};
int i;
};*/
#endif
/*FILTER_EVENT_INFO_H_*/
modules/video_filter/opencv_example.cpp
0 → 100644
View file @
989cefff
/*****************************************************************************
* opencv_example.cpp : Example OpenCV internal video filter
* (performs face identification). Mostly taken from the facedetect.c
* OpenCV sample.
*****************************************************************************
* Copyright (C) 2006 the VideoLAN team
*
* Authors: Dugal Harris <dugalh@protoclea.co.za>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
/*****************************************************************************
* Preamble
*****************************************************************************/
#include <cxcore.h>
#include <cv.h>
#include <highgui.h>
#include <vlc/vlc.h>
#include <vlc/decoder.h>
#include "vlc_filter.h"
#include "filter_common.h"
#include "vlc_image.h"
#include "filter_event_info.h"
/*****************************************************************************
* filter_sys_t : filter descriptor
*****************************************************************************/
struct
filter_sys_t
{
CvMemStorage
*
p_storage
;
CvHaarClassifierCascade
*
p_cascade
;
video_filter_event_info_t
event_info
;
int
i_id
;
};
/****************************************************************************
* Local prototypes
****************************************************************************/
static
int
OpenFilter
(
vlc_object_t
*
);
static
void
CloseFilter
(
vlc_object_t
*
);
static
picture_t
*
Filter
(
filter_t
*
,
picture_t
*
);
/*****************************************************************************
* Module descriptor
*****************************************************************************/
vlc_module_begin
();
set_description
(
_
(
"OpenCV face detection example filter"
)
);
set_shortname
(
N_
(
"OpenCV example"
));
set_capability
(
"opencv example"
,
1
);
add_shortcut
(
"opencv_example"
);
set_category
(
CAT_VIDEO
);
set_subcategory
(
SUBCAT_VIDEO_VFILTER2
);
set_callbacks
(
OpenFilter
,
CloseFilter
);
add_string
(
"opencv-haarcascade-file"
,
"c:
\\
haarcascade_frontalface_alt.xml"
,
NULL
,
N_
(
"Haar cascade filename"
),
N_
(
"Name of XML file containing Haar cascade description"
),
VLC_FALSE
);
vlc_module_end
();
/*****************************************************************************
* OpenFilter: probe the filter and return score
*****************************************************************************/
static
int
OpenFilter
(
vlc_object_t
*
p_this
)
{
filter_t
*
p_filter
=
(
filter_t
*
)
p_this
;
filter_sys_t
*
p_sys
;
/* Allocate the memory needed to store the decoder's structure */
if
(
(
p_filter
->
p_sys
=
p_sys
=
(
filter_sys_t
*
)
malloc
(
sizeof
(
filter_sys_t
))
)
==
NULL
)
{
msg_Err
(
p_filter
,
"out of memory"
);
return
VLC_EGENERIC
;
}
//init the video_filter_event_info_t struct
p_sys
->
event_info
.
i_region_size
=
0
;
p_sys
->
event_info
.
p_region
=
NULL
;
p_sys
->
i_id
=
0
;
p_filter
->
pf_video_filter
=
Filter
;
//create the VIDEO_FILTER_EVENT_VARIABLE
vlc_value_t
val
;
if
(
var_Create
(
p_filter
->
p_libvlc
,
VIDEO_FILTER_EVENT_VARIABLE
,
VLC_VAR_ADDRESS
|
VLC_VAR_DOINHERIT
)
!=
VLC_SUCCESS
)
msg_Err
(
p_filter
,
"Could not create %s
\n
"
,
VIDEO_FILTER_EVENT_VARIABLE
);
val
.
p_address
=
&
(
p_sys
->
event_info
);
if
(
var_Set
(
p_filter
->
p_libvlc
,
VIDEO_FILTER_EVENT_VARIABLE
,
val
)
!=
VLC_SUCCESS
)
msg_Err
(
p_filter
,
"Could not set %s
\n
"
,
VIDEO_FILTER_EVENT_VARIABLE
);
//OpenCV init specific to this example
char
*
filename
=
config_GetPsz
(
p_filter
,
"opencv-haarcascade-file"
);
p_filter
->
p_sys
->
p_cascade
=
(
CvHaarClassifierCascade
*
)
cvLoad
(
filename
,
0
,
0
,
0
);
p_filter
->
p_sys
->
p_storage
=
cvCreateMemStorage
(
0
);
return
VLC_SUCCESS
;
}
/*****************************************************************************
* CloseFilter: clean up the filter
*****************************************************************************/
static
void
CloseFilter
(
vlc_object_t
*
p_this
)
{
filter_t
*
p_filter
=
(
filter_t
*
)
p_this
;
filter_sys_t
*
p_sys
=
p_filter
->
p_sys
;
if
(
p_filter
->
p_sys
->
p_cascade
)
cvReleaseHaarClassifierCascade
(
&
p_filter
->
p_sys
->
p_cascade
);
if
(
p_filter
->
p_sys
->
p_storage
)
cvReleaseMemStorage
(
&
p_filter
->
p_sys
->
p_storage
);
if
(
NULL
!=
p_filter
->
p_sys
->
event_info
.
p_region
)
free
(
p_filter
->
p_sys
->
event_info
.
p_region
);
free
(
p_sys
);
var_Destroy
(
p_filter
->
p_libvlc
,
VIDEO_FILTER_EVENT_VARIABLE
);
}
/****************************************************************************
* Filter: Check for faces and raises an event when one is found.
****************************************************************************
* p_pic: A picture_t with its p_data_orig member set to an array of
* IplImages (one image for each picture_t plane).
****************************************************************************/
static
picture_t
*
Filter
(
filter_t
*
p_filter
,
picture_t
*
p_pic
)
{
IplImage
**
p_img
=
NULL
;
int
i_planes
=
0
;
CvPoint
pt1
,
pt2
;
int
i
,
scale
=
1
;
if
((
!
p_pic
)
)
{
msg_Err
(
p_filter
,
"no image array"
);
return
NULL
;
}
if
(
!
(
p_pic
->
p_data_orig
))
{
msg_Err
(
p_filter
,
"no image array"
);
return
NULL
;
}
//(hack) cast the picture_t to array of IplImage*
p_img
=
(
IplImage
**
)
p_pic
->
p_data_orig
;
i_planes
=
p_pic
->
i_planes
;
//check the image array for validity
if
((
!
p_img
[
0
]))
//1st plane is 'I' i.e. greyscale
{
msg_Err
(
p_filter
,
"no image"
);
return
NULL
;
}
if
((
p_pic
->
format
.
i_chroma
!=
VLC_FOURCC
(
'I'
,
'4'
,
'2'
,
'0'
)))
{
msg_Err
(
p_filter
,
"wrong chroma - use I420"
);
return
NULL
;
}
if
(
i_planes
<
1
)
{
msg_Err
(
p_filter
,
"no image planes"
);
return
NULL
;
}
//perform face detection
cvClearMemStorage
(
p_filter
->
p_sys
->
p_storage
);
CvSeq
*
faces
=
NULL
;
if
(
p_filter
->
p_sys
->
p_cascade
)
{
//we should make some of these params config variables
faces
=
cvHaarDetectObjects
(
p_img
[
0
],
p_filter
->
p_sys
->
p_cascade
,
p_filter
->
p_sys
->
p_storage
,
1.15
,
5
,
CV_HAAR_DO_CANNY_PRUNING
,
cvSize
(
20
,
20
)
);
//create the video_filter_region_info_t struct
CvRect
*
r
;
if
(
faces
&&
(
faces
->
total
>
0
))
{
//msg_Dbg( p_filter, "Found %d face(s)\n", faces->total );
if
(
NULL
!=
p_filter
->
p_sys
->
event_info
.
p_region
)
{
free
(
p_filter
->
p_sys
->
event_info
.
p_region
);
p_filter
->
p_sys
->
event_info
.
p_region
=
NULL
;
}
if
(
NULL
==
(
p_filter
->
p_sys
->
event_info
.
p_region
=
(
video_filter_region_info_t
*
)
malloc
(
faces
->
total
*
sizeof
(
video_filter_region_info_t
))))
{
msg_Err
(
p_filter
,
"out of memory"
);
return
NULL
;
}
memset
(
p_filter
->
p_sys
->
event_info
.
p_region
,
0
,
faces
->
total
*
sizeof
(
video_filter_region_info_t
));
p_filter
->
p_sys
->
event_info
.
i_region_size
=
faces
->
total
;
}
//populate the video_filter_region_info_t struct
for
(
i
=
0
;
i
<
(
faces
?
faces
->
total
:
0
);
i
++
)
{
r
=
(
CvRect
*
)
cvGetSeqElem
(
faces
,
i
);
pt1
.
x
=
r
->
x
*
scale
;
pt2
.
x
=
(
r
->
x
+
r
->
width
)
*
scale
;
pt1
.
y
=
r
->
y
*
scale
;
pt2
.
y
=
(
r
->
y
+
r
->
height
)
*
scale
;
cvRectangle
(
p_img
[
0
],
pt1
,
pt2
,
CV_RGB
(
0
,
0
,
0
),
3
,
8
,
0
);
*
(
CvRect
*
)(
&
(
p_filter
->
p_sys
->
event_info
.
p_region
[
i
]))
=
*
r
;
p_filter
->
p_sys
->
event_info
.
p_region
[
i
].
i_id
=
p_filter
->
p_sys
->
i_id
++
;
p_filter
->
p_sys
->
event_info
.
p_region
[
i
].
p_description
=
"Face Detected"
;
}
if
(
faces
&&
(
faces
->
total
>
0
))
//raise the video filter event
var_Change
(
p_filter
->
p_libvlc
,
VIDEO_FILTER_EVENT_VARIABLE
,
VLC_VAR_TRIGGER_CALLBACKS
,
NULL
,
NULL
);
}
else
msg_Err
(
p_filter
,
"No cascade - is opencv-haarcascade-file valid?"
);
return
p_pic
;
}
modules/video_filter/opencv_wrapper.c
0 → 100644
View file @
989cefff
This diff is collapsed.
Click to expand it.
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