handdetect: Use already mapped image
No need to map again the image, it's already handled by the base class.
This commit is contained in:
parent
efde572cec
commit
09fc19b83f
@ -156,8 +156,6 @@ gst_handdetect_finalize (GObject * obj)
|
|||||||
{
|
{
|
||||||
GstHanddetect *filter = GST_HANDDETECT (obj);
|
GstHanddetect *filter = GST_HANDDETECT (obj);
|
||||||
|
|
||||||
if (filter->cvImage)
|
|
||||||
cvReleaseImage (&filter->cvImage);
|
|
||||||
if (filter->cvGray)
|
if (filter->cvGray)
|
||||||
cvReleaseImage (&filter->cvGray);
|
cvReleaseImage (&filter->cvGray);
|
||||||
if (filter->cvStorage)
|
if (filter->cvStorage)
|
||||||
@ -368,10 +366,6 @@ gst_handdetect_set_caps (GstOpencvVideoFilter * transform,
|
|||||||
cvReleaseImage (&filter->cvGray);
|
cvReleaseImage (&filter->cvGray);
|
||||||
filter->cvGray =
|
filter->cvGray =
|
||||||
cvCreateImage (cvSize (in_width, in_height), IPL_DEPTH_8U, 1);
|
cvCreateImage (cvSize (in_width, in_height), IPL_DEPTH_8U, 1);
|
||||||
if (filter->cvImage)
|
|
||||||
cvReleaseImage (&filter->cvImage);
|
|
||||||
filter->cvImage =
|
|
||||||
cvCreateImage (cvSize (in_width, in_height), IPL_DEPTH_8U, 3);
|
|
||||||
|
|
||||||
if (!filter->cvStorage)
|
if (!filter->cvStorage)
|
||||||
filter->cvStorage = cvCreateMemStorage (0);
|
filter->cvStorage = cvCreateMemStorage (0);
|
||||||
@ -392,25 +386,20 @@ gst_handdetect_transform_ip (GstOpencvVideoFilter * transform,
|
|||||||
GstBuffer * buffer, IplImage * img)
|
GstBuffer * buffer, IplImage * img)
|
||||||
{
|
{
|
||||||
GstHanddetect *filter = GST_HANDDETECT (transform);
|
GstHanddetect *filter = GST_HANDDETECT (transform);
|
||||||
GstMapInfo info;
|
|
||||||
CvSeq *hands;
|
CvSeq *hands;
|
||||||
CvRect *r;
|
CvRect *r;
|
||||||
GstStructure *s;
|
GstStructure *s;
|
||||||
GstMessage *m;
|
GstMessage *m;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
buffer = gst_buffer_make_writable (buffer);
|
|
||||||
gst_buffer_map (buffer, &info, GST_MAP_READWRITE);
|
|
||||||
|
|
||||||
filter->cvImage->imageData = (char *) info.data;
|
|
||||||
/* cvt to gray colour space for hand detect */
|
|
||||||
cvCvtColor (filter->cvImage, filter->cvGray, CV_RGB2GRAY);
|
|
||||||
cvClearMemStorage (filter->cvStorage);
|
|
||||||
|
|
||||||
/* check detection cascades */
|
/* check detection cascades */
|
||||||
if (!filter->cvCascade_fist || !filter->cvCascade_palm)
|
if (!filter->cvCascade_fist || !filter->cvCascade_palm)
|
||||||
return GST_FLOW_OK;
|
return GST_FLOW_OK;
|
||||||
|
|
||||||
|
/* cvt to gray colour space for hand detect */
|
||||||
|
cvCvtColor (img, filter->cvGray, CV_RGB2GRAY);
|
||||||
|
cvClearMemStorage (filter->cvStorage);
|
||||||
|
|
||||||
/* detect FIST gesture fist */
|
/* detect FIST gesture fist */
|
||||||
hands =
|
hands =
|
||||||
cvHaarDetectObjects (filter->cvGray, filter->cvCascade_fist,
|
cvHaarDetectObjects (filter->cvGray, filter->cvCascade_fist,
|
||||||
@ -425,18 +414,16 @@ gst_handdetect_transform_ip (GstOpencvVideoFilter * transform,
|
|||||||
int min_distance, distance;
|
int min_distance, distance;
|
||||||
CvRect temp_r;
|
CvRect temp_r;
|
||||||
CvPoint c;
|
CvPoint c;
|
||||||
/* set frame buffer writable */
|
|
||||||
if (filter->display) {
|
GST_DEBUG_OBJECT (filter, "%d FIST gestures detected\n",
|
||||||
buffer = gst_buffer_make_writable (buffer);
|
(int) hands->total);
|
||||||
GST_DEBUG_OBJECT (filter, "%d FIST gestures detected\n",
|
|
||||||
(int) hands->total);
|
|
||||||
}
|
|
||||||
/* Go through all detected FIST gestures to get the best one
|
/* Go through all detected FIST gestures to get the best one
|
||||||
* prev_r => previous hand
|
* prev_r => previous hand
|
||||||
* best_r => best hand in this frame
|
* best_r => best hand in this frame
|
||||||
*/
|
*/
|
||||||
/* set min_distance for init comparison */
|
/* set min_distance for init comparison */
|
||||||
min_distance = filter->cvImage->width + filter->cvImage->height;
|
min_distance = img->width + img->height;
|
||||||
/* Init filter->prev_r */
|
/* Init filter->prev_r */
|
||||||
temp_r = cvRect (0, 0, 0, 0);
|
temp_r = cvRect (0, 0, 0, 0);
|
||||||
if (filter->prev_r == NULL)
|
if (filter->prev_r == NULL)
|
||||||
@ -502,7 +489,7 @@ gst_handdetect_transform_ip (GstOpencvVideoFilter * transform,
|
|||||||
center.y = cvRound ((filter->best_r->y + filter->best_r->height * 0.5));
|
center.y = cvRound ((filter->best_r->y + filter->best_r->height * 0.5));
|
||||||
radius =
|
radius =
|
||||||
cvRound ((filter->best_r->width + filter->best_r->height) * 0.25);
|
cvRound ((filter->best_r->width + filter->best_r->height) * 0.25);
|
||||||
cvCircle (filter->cvImage, center, radius, CV_RGB (0, 0, 200), 1, 8, 0);
|
cvCircle (img, center, radius, CV_RGB (0, 0, 200), 1, 8, 0);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* if NO FIST gesture, detecting PALM gesture */
|
/* if NO FIST gesture, detecting PALM gesture */
|
||||||
@ -529,7 +516,7 @@ gst_handdetect_transform_ip (GstOpencvVideoFilter * transform,
|
|||||||
* best_r => best hand in this frame
|
* best_r => best hand in this frame
|
||||||
*/
|
*/
|
||||||
/* suppose a min_distance for init comparison */
|
/* suppose a min_distance for init comparison */
|
||||||
min_distance = filter->cvImage->width + filter->cvImage->height;
|
min_distance = img->width + img->height;
|
||||||
/* Init filter->prev_r */
|
/* Init filter->prev_r */
|
||||||
temp_r = cvRect (0, 0, 0, 0);
|
temp_r = cvRect (0, 0, 0, 0);
|
||||||
if (filter->prev_r == NULL)
|
if (filter->prev_r == NULL)
|
||||||
@ -611,11 +598,11 @@ gst_handdetect_transform_ip (GstOpencvVideoFilter * transform,
|
|||||||
center.y = cvRound ((filter->best_r->y + filter->best_r->height * 0.5));
|
center.y = cvRound ((filter->best_r->y + filter->best_r->height * 0.5));
|
||||||
radius =
|
radius =
|
||||||
cvRound ((filter->best_r->width + filter->best_r->height) * 0.25);
|
cvRound ((filter->best_r->width + filter->best_r->height) * 0.25);
|
||||||
cvCircle (filter->cvImage, center, radius, CV_RGB (0, 0, 200), 1, 8, 0);
|
cvCircle (img, center, radius, CV_RGB (0, 0, 200), 1, 8, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
gst_buffer_unmap (buffer, &info);
|
|
||||||
/* Push out the incoming buffer */
|
/* Push out the incoming buffer */
|
||||||
return GST_FLOW_OK;
|
return GST_FLOW_OK;
|
||||||
}
|
}
|
||||||
|
@ -87,10 +87,8 @@ struct _GstHanddetect
|
|||||||
guint roi_height;
|
guint roi_height;
|
||||||
|
|
||||||
/* opencv
|
/* opencv
|
||||||
* cvImage - image from video cam,
|
* cvGray - image to gray colour
|
||||||
* cvGray - cvt cvImage to gray colour
|
|
||||||
*/
|
*/
|
||||||
IplImage *cvImage;
|
|
||||||
IplImage *cvGray;
|
IplImage *cvGray;
|
||||||
CvHaarClassifierCascade *cvCascade_fist;
|
CvHaarClassifierCascade *cvCascade_fist;
|
||||||
CvHaarClassifierCascade *cvCascade_palm;
|
CvHaarClassifierCascade *cvCascade_palm;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user