Skip to content

Commit

Permalink
vcap: Initial implementation
Browse files Browse the repository at this point in the history
This UPM module captures a still frame from a Linux V4L device, such
as a USB webcam, and and then allows you to save it as a JPEG image
into a file.

The camera and driver in use must support streaming, mmap-able buffers
and must provide data in YUYV format.  This should encompass most
video cameras out there.  It has been tested with a few off the shelf
USB cameras without any problems.

Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
  • Loading branch information
jontrulson authored and Propanu committed Apr 19, 2016
1 parent bf7d7d1 commit 4f6be75
Show file tree
Hide file tree
Showing 13 changed files with 1,073 additions and 0 deletions.
1 change: 1 addition & 0 deletions examples/c++/CMakeLists.txt
Expand Up @@ -264,6 +264,7 @@ if (BACNET_FOUND)
include_directories(${PROJECT_SOURCE_DIR}/src/bacnetmstp)
add_example (e50hx)
endif()
add_example (vcap)

# These are special cases where you specify example binary, source file and module(s)
include_directories (${PROJECT_SOURCE_DIR}/src)
Expand Down
70 changes: 70 additions & 0 deletions examples/c++/vcap.cxx
@@ -0,0 +1,70 @@
/*
* Author: Jon Trulson <jtrulson@ics.com>
* Copyright (c) 2016 Intel Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/

#include <unistd.h>
#include <iostream>

#include "vcap.hpp"

using namespace std;

int main(int argc, char **argv)
{
//! [Interesting]

string defaultDev = "/dev/video0";

// if an argument was specified, use it as the device instead
if (argc > 1)
defaultDev = string(argv[1]);

cout << "Using device " << defaultDev << endl;
cout << "Initializing..." << endl;

// Instantiate an VCAP instance, using the specified video device
upm::VCAP *sensor = new upm::VCAP(defaultDev);

// enable some debug/verbose output
sensor->setDebug(true);

// This is just a hint. The kernel can change this to a lower
// resolution that the hardware supports. Use getWidth() and
// getHeight() methods to see what the kernel actually chose if you
// care.
sensor->setResolution(1920, 1080);

// capture an image
sensor->captureImage();

// convert and save it as a jpeg
sensor->saveImage("video-img1.jpg");

cout << "Exiting..." << endl;

delete sensor;

//! [Interesting]

return 0;
}
1 change: 1 addition & 0 deletions examples/java/CMakeLists.txt
Expand Up @@ -120,6 +120,7 @@ endif()
if (BACNET_FOUND)
add_example(E50HX_Example e50hx)
endif()
add_example(VCAP_Example vcap)

add_example_with_path(Jhd1313m1_lcdSample lcd i2clcd)
add_example_with_path(Jhd1313m1Sample lcd i2clcd)
Expand Down
60 changes: 60 additions & 0 deletions examples/java/VCAP_Example.java
@@ -0,0 +1,60 @@
/*
* Author: Jon Trulson <jtrulson@ics.com>
* Copyright (c) 2016 Intel Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/

import upm_vcap.VCAP;

public class VCAP_Example
{
private static String defaultDev = "/dev/video0";

public static void main(String[] args) throws InterruptedException
{
// ! [Interesting]
if (args.length > 0)
defaultDev = args[0];

System.out.println("Using device " + defaultDev);
System.out.println("Initializing...");

// Instantiate an VCAP instance, using the specified video device
VCAP sensor = new VCAP(defaultDev);

// enable some debug/verbose output
sensor.setDebug(true);

// This is just a hint. The kernel can change this to a lower
// resolution that the hardware supports. Use getWidth() and
// getHeight() methods to see what the kernel actually chose if you
// care.
sensor.setResolution(1920, 1080);

// capture an image
sensor.captureImage();

// convert and save it as a jpeg
sensor.saveImage("video-img1.jpg");

// ! [Interesting]
}
}
69 changes: 69 additions & 0 deletions examples/javascript/vcap.js
@@ -0,0 +1,69 @@
/*jslint node:true, vars:true, bitwise:true, unparam:true */
/*jshint unused:true */

/*
* Author: Jon Trulson <jtrulson@ics.com>
* Copyright (c) 2016 Intel Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/


var sensorObj = require('jsupm_vcap');


/************** Main code **************/

var defaultDev = "/dev/video0";

// if an argument was specified, use it as the device instead
if (process.argv.length > 2)
{
defaultDev = process.argv[2];
}

console.log("Using device " + defaultDev);
console.log("Initializing...");

// Instantiate an VCAP instance, using the specified video device
var sensor = new sensorObj.VCAP(defaultDev);

// enable some debug/verbose output
sensor.setDebug(true);

// This is just a hint. The kernel can change this to a lower
// resolution that the hardware supports. Use getWidth() and
// getHeight() methods to see what the kernel actually chose if you
// care.
sensor.setResolution(1920, 1080);

// capture an image
sensor.captureImage();

// convert and save it as a jpeg
sensor.saveImage("video-img1.jpg");

// make sure we clean up
sensor = null;
sensorObj.cleanUp();
sensorObj = null;
console.log("Exiting...");
process.exit(0);

67 changes: 67 additions & 0 deletions examples/python/vcap.py
@@ -0,0 +1,67 @@
#!/usr/bin/python
# Author: Jon Trulson <jtrulson@ics.com>
# Copyright (c) 2016 Intel Corporation.
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

import time, sys, signal, atexit
import pyupm_vcap as sensorObj

## Exit handlers ##
# This function stops python from printing a stacktrace when you hit control-C
def SIGINTHandler(signum, frame):
raise SystemExit

# This function lets you run code on exit
def exitHandler():
print "Exiting..."
sys.exit(0)

# Register exit handlers
atexit.register(exitHandler)
signal.signal(signal.SIGINT, SIGINTHandler)

defaultDev = "/dev/video0"

# if an argument was specified, use it as the device instead
if (len(sys.argv) > 1):
defaultDev = sys.argv[1]

print "Using device", defaultDev
print "Initializing..."

# Instantiate an VCAP instance, using the specified video device
sensor = sensorObj.VCAP(defaultDev)

# enable some debug/verbose output
sensor.setDebug(True);

# This is just a hint. The kernel can change this to a lower
# resolution that the hardware supports. Use getWidth() and
# getHeight() methods to see what the kernel actually chose if you
# care.
sensor.setResolution(1920, 1080);

# capture an image
sensor.captureImage();

# convert and save it as a jpeg
sensor.saveImage("video-img1.jpg");

6 changes: 6 additions & 0 deletions src/upm.h
Expand Up @@ -221,6 +221,12 @@
* @ingroup bycat
*/

/**
* @brief Provide video or video camera access
* @defgroup video Video
* @ingroup bycat
*/

/**
* @brief Provide WiFi, Bluetooth, RF communication
* @defgroup wifi Wireless Communication
Expand Down
18 changes: 18 additions & 0 deletions src/vcap/CMakeLists.txt
@@ -0,0 +1,18 @@
set (libname "vcap")
set (libdescription "upm Video Frame Capture and image save utility")
set (module_src ${libname}.cxx)
set (module_h ${libname}.hpp)
set (reqlibname "jpeg")
upm_module_init()
target_link_libraries(${libname} jpeg)
if (BUILDSWIG)
if (BUILDSWIGNODE)
swig_link_libraries (jsupm_${libname} jpeg ${MRAA_LIBRARIES} ${NODE_LIBRARIES})
endif()
if (BUILDSWIGPYTHON)
swig_link_libraries (pyupm_${libname} jpeg ${PYTHON_LIBRARIES} ${MRAA_LIBRARIES})
endif()
if (BUILDSWIGJAVA)
swig_link_libraries (javaupm_${libname} jpeg ${MRAAJAVA_LDFLAGS} ${JAVA_LDFLAGS})
endif()
endif()
19 changes: 19 additions & 0 deletions src/vcap/javaupm_vcap.i
@@ -0,0 +1,19 @@
%module javaupm_vcap
%include "../upm.i"
%include "std_string.i"

%include "vcap.hpp"
%{
#include "vcap.hpp"
%}

%pragma(java) jniclasscode=%{
static {
try {
System.loadLibrary("javaupm_vcap");
} catch (UnsatisfiedLinkError e) {
System.err.println("Native code library failed to load. \n" + e);
System.exit(1);
}
}
%}
10 changes: 10 additions & 0 deletions src/vcap/jsupm_vcap.i
@@ -0,0 +1,10 @@
%module jsupm_vcap
%include "../upm.i"
%include "std_string.i"

%include "vcap.hpp"
%{
#include "vcap.hpp"
%}


14 changes: 14 additions & 0 deletions src/vcap/pyupm_vcap.i
@@ -0,0 +1,14 @@
// Include doxygen-generated documentation
%include "pyupm_doxy2swig.i"
%module pyupm_vcap
%include "../upm.i"
%include "std_string.i"

%feature("autodoc", "3");

%include "vcap.hpp"
%{
#include "vcap.hpp"
%}


0 comments on commit 4f6be75

Please sign in to comment.