Display camera frame
This commit is contained in:
332
vendor/gocv.io/x/gocv/videoio.go
generated
vendored
Normal file
332
vendor/gocv.io/x/gocv/videoio.go
generated
vendored
Normal file
@@ -0,0 +1,332 @@
|
||||
package gocv
|
||||
|
||||
/*
|
||||
#include <stdlib.h>
|
||||
#include "videoio.h"
|
||||
*/
|
||||
import "C"
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"sync"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
// VideoCaptureProperties are the properties used for VideoCapture operations.
|
||||
type VideoCaptureProperties int
|
||||
|
||||
const (
|
||||
// VideoCapturePosMsec contains current position of the
|
||||
// video file in milliseconds.
|
||||
VideoCapturePosMsec VideoCaptureProperties = 0
|
||||
|
||||
// VideoCapturePosFrames 0-based index of the frame to be
|
||||
// decoded/captured next.
|
||||
VideoCapturePosFrames = 1
|
||||
|
||||
// VideoCapturePosAVIRatio relative position of the video file:
|
||||
// 0=start of the film, 1=end of the film.
|
||||
VideoCapturePosAVIRatio = 2
|
||||
|
||||
// VideoCaptureFrameWidth is width of the frames in the video stream.
|
||||
VideoCaptureFrameWidth = 3
|
||||
|
||||
// VideoCaptureFrameHeight controls height of frames in the video stream.
|
||||
VideoCaptureFrameHeight = 4
|
||||
|
||||
// VideoCaptureFPS controls capture frame rate.
|
||||
VideoCaptureFPS = 5
|
||||
|
||||
// VideoCaptureFOURCC contains the 4-character code of codec.
|
||||
// see VideoWriter::fourcc for details.
|
||||
VideoCaptureFOURCC = 6
|
||||
|
||||
// VideoCaptureFrameCount contains number of frames in the video file.
|
||||
VideoCaptureFrameCount = 7
|
||||
|
||||
// VideoCaptureFormat format of the Mat objects returned by
|
||||
// VideoCapture::retrieve().
|
||||
VideoCaptureFormat = 8
|
||||
|
||||
// VideoCaptureMode contains backend-specific value indicating
|
||||
// the current capture mode.
|
||||
VideoCaptureMode = 9
|
||||
|
||||
// VideoCaptureBrightness is brightness of the image
|
||||
// (only for those cameras that support).
|
||||
VideoCaptureBrightness = 10
|
||||
|
||||
// VideoCaptureContrast is contrast of the image
|
||||
// (only for cameras that support it).
|
||||
VideoCaptureContrast = 11
|
||||
|
||||
// VideoCaptureSaturation saturation of the image
|
||||
// (only for cameras that support).
|
||||
VideoCaptureSaturation = 12
|
||||
|
||||
// VideoCaptureHue hue of the image (only for cameras that support).
|
||||
VideoCaptureHue = 13
|
||||
|
||||
// VideoCaptureGain is the gain of the capture image.
|
||||
// (only for those cameras that support).
|
||||
VideoCaptureGain = 14
|
||||
|
||||
// VideoCaptureExposure is the exposure of the capture image.
|
||||
// (only for those cameras that support).
|
||||
VideoCaptureExposure = 15
|
||||
|
||||
// VideoCaptureConvertRGB is a boolean flags indicating whether
|
||||
// images should be converted to RGB.
|
||||
VideoCaptureConvertRGB = 16
|
||||
|
||||
// VideoCaptureWhiteBalanceBlueU is currently unsupported.
|
||||
VideoCaptureWhiteBalanceBlueU = 17
|
||||
|
||||
// VideoCaptureRectification is the rectification flag for stereo cameras.
|
||||
// Note: only supported by DC1394 v 2.x backend currently.
|
||||
VideoCaptureRectification = 18
|
||||
|
||||
// VideoCaptureMonochrome indicates whether images should be
|
||||
// converted to monochrome.
|
||||
VideoCaptureMonochrome = 19
|
||||
|
||||
// VideoCaptureSharpness controls image capture sharpness.
|
||||
VideoCaptureSharpness = 20
|
||||
|
||||
// VideoCaptureAutoExposure controls the DC1394 exposure control
|
||||
// done by camera, user can adjust reference level using this feature.
|
||||
VideoCaptureAutoExposure = 21
|
||||
|
||||
// VideoCaptureGamma controls video capture gamma.
|
||||
VideoCaptureGamma = 22
|
||||
|
||||
// VideoCaptureTemperature controls video capture temperature.
|
||||
VideoCaptureTemperature = 23
|
||||
|
||||
// VideoCaptureTrigger controls video capture trigger.
|
||||
VideoCaptureTrigger = 24
|
||||
|
||||
// VideoCaptureTriggerDelay controls video capture trigger delay.
|
||||
VideoCaptureTriggerDelay = 25
|
||||
|
||||
// VideoCaptureWhiteBalanceRedV controls video capture setting for
|
||||
// white balance.
|
||||
VideoCaptureWhiteBalanceRedV = 26
|
||||
|
||||
// VideoCaptureZoom controls video capture zoom.
|
||||
VideoCaptureZoom = 27
|
||||
|
||||
// VideoCaptureFocus controls video capture focus.
|
||||
VideoCaptureFocus = 28
|
||||
|
||||
// VideoCaptureGUID controls video capture GUID.
|
||||
VideoCaptureGUID = 29
|
||||
|
||||
// VideoCaptureISOSpeed controls video capture ISO speed.
|
||||
VideoCaptureISOSpeed = 30
|
||||
|
||||
// VideoCaptureBacklight controls video capture backlight.
|
||||
VideoCaptureBacklight = 32
|
||||
|
||||
// VideoCapturePan controls video capture pan.
|
||||
VideoCapturePan = 33
|
||||
|
||||
// VideoCaptureTilt controls video capture tilt.
|
||||
VideoCaptureTilt = 34
|
||||
|
||||
// VideoCaptureRoll controls video capture roll.
|
||||
VideoCaptureRoll = 35
|
||||
|
||||
// VideoCaptureIris controls video capture iris.
|
||||
VideoCaptureIris = 36
|
||||
|
||||
// VideoCaptureSettings is the pop up video/camera filter dialog. Note:
|
||||
// only supported by DSHOW backend currently. The property value is ignored.
|
||||
VideoCaptureSettings = 37
|
||||
|
||||
// VideoCaptureBufferSize controls video capture buffer size.
|
||||
VideoCaptureBufferSize = 38
|
||||
|
||||
// VideoCaptureAutoFocus controls video capture auto focus..
|
||||
VideoCaptureAutoFocus = 39
|
||||
)
|
||||
|
||||
// VideoCapture is a wrapper around the OpenCV VideoCapture class.
|
||||
//
|
||||
// For further details, please see:
|
||||
// http://docs.opencv.org/master/d8/dfe/classcv_1_1VideoCapture.html
|
||||
//
|
||||
type VideoCapture struct {
|
||||
p C.VideoCapture
|
||||
}
|
||||
|
||||
// VideoCaptureFile opens a VideoCapture from a file and prepares
|
||||
// to start capturing. It returns error if it fails to open the file stored in uri path.
|
||||
func VideoCaptureFile(uri string) (vc *VideoCapture, err error) {
|
||||
vc = &VideoCapture{p: C.VideoCapture_New()}
|
||||
|
||||
cURI := C.CString(uri)
|
||||
defer C.free(unsafe.Pointer(cURI))
|
||||
|
||||
if !C.VideoCapture_Open(vc.p, cURI) {
|
||||
err = fmt.Errorf("Error opening file: %s", uri)
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// VideoCaptureDevice opens a VideoCapture from a device and prepares
|
||||
// to start capturing. It returns error if it fails to open the video device.
|
||||
func VideoCaptureDevice(device int) (vc *VideoCapture, err error) {
|
||||
vc = &VideoCapture{p: C.VideoCapture_New()}
|
||||
|
||||
if !C.VideoCapture_OpenDevice(vc.p, C.int(device)) {
|
||||
err = fmt.Errorf("Error opening device: %d", device)
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// Close VideoCapture object.
|
||||
func (v *VideoCapture) Close() error {
|
||||
C.VideoCapture_Close(v.p)
|
||||
v.p = nil
|
||||
return nil
|
||||
}
|
||||
|
||||
// Set parameter with property (=key).
|
||||
func (v *VideoCapture) Set(prop VideoCaptureProperties, param float64) {
|
||||
C.VideoCapture_Set(v.p, C.int(prop), C.double(param))
|
||||
}
|
||||
|
||||
// Get parameter with property (=key).
|
||||
func (v VideoCapture) Get(prop VideoCaptureProperties) float64 {
|
||||
return float64(C.VideoCapture_Get(v.p, C.int(prop)))
|
||||
}
|
||||
|
||||
// IsOpened returns if the VideoCapture has been opened to read from
|
||||
// a file or capture device.
|
||||
func (v *VideoCapture) IsOpened() bool {
|
||||
isOpened := C.VideoCapture_IsOpened(v.p)
|
||||
return isOpened != 0
|
||||
}
|
||||
|
||||
// Read reads the next frame from the VideoCapture to the Mat passed in
|
||||
// as the param. It returns false if the VideoCapture cannot read frame.
|
||||
func (v *VideoCapture) Read(m *Mat) bool {
|
||||
return C.VideoCapture_Read(v.p, m.p) != 0
|
||||
}
|
||||
|
||||
// Grab skips a specific number of frames.
|
||||
func (v *VideoCapture) Grab(skip int) {
|
||||
C.VideoCapture_Grab(v.p, C.int(skip))
|
||||
}
|
||||
|
||||
// CodecString returns a string representation of FourCC bytes, i.e. the name of a codec
|
||||
func (v *VideoCapture) CodecString() string {
|
||||
res := ""
|
||||
hexes := []int64{0xff, 0xff00, 0xff0000, 0xff000000}
|
||||
for i, h := range hexes {
|
||||
res += string(int64(v.Get(VideoCaptureFOURCC)) & h >> (uint(i * 8)))
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
// ToCodec returns an float64 representation of FourCC bytes
|
||||
func (v *VideoCapture) ToCodec(codec string) float64 {
|
||||
if len(codec) != 4 {
|
||||
return -1.0
|
||||
}
|
||||
c1 := []rune(string(codec[0]))[0]
|
||||
c2 := []rune(string(codec[1]))[0]
|
||||
c3 := []rune(string(codec[2]))[0]
|
||||
c4 := []rune(string(codec[3]))[0]
|
||||
return float64((c1 & 255) + ((c2 & 255) << 8) + ((c3 & 255) << 16) + ((c4 & 255) << 24))
|
||||
}
|
||||
|
||||
// VideoWriter is a wrapper around the OpenCV VideoWriter`class.
|
||||
//
|
||||
// For further details, please see:
|
||||
// http://docs.opencv.org/master/dd/d9e/classcv_1_1VideoWriter.html
|
||||
//
|
||||
type VideoWriter struct {
|
||||
mu *sync.RWMutex
|
||||
p C.VideoWriter
|
||||
}
|
||||
|
||||
// VideoWriterFile opens a VideoWriter with a specific output file.
|
||||
// The "codec" param should be the four-letter code for the desired output
|
||||
// codec, for example "MJPG".
|
||||
//
|
||||
// For further details, please see:
|
||||
// http://docs.opencv.org/master/dd/d9e/classcv_1_1VideoWriter.html#a0901c353cd5ea05bba455317dab81130
|
||||
//
|
||||
func VideoWriterFile(name string, codec string, fps float64, width int, height int, isColor bool) (vw *VideoWriter, err error) {
|
||||
|
||||
if fps == 0 || width == 0 || height == 0 {
|
||||
return nil, fmt.Errorf("one of the numerical parameters "+
|
||||
"is equal to zero: FPS: %f, width: %d, height: %d", fps, width, height)
|
||||
}
|
||||
|
||||
vw = &VideoWriter{
|
||||
p: C.VideoWriter_New(),
|
||||
mu: &sync.RWMutex{},
|
||||
}
|
||||
|
||||
cName := C.CString(name)
|
||||
defer C.free(unsafe.Pointer(cName))
|
||||
|
||||
cCodec := C.CString(codec)
|
||||
defer C.free(unsafe.Pointer(cCodec))
|
||||
|
||||
C.VideoWriter_Open(vw.p, cName, cCodec, C.double(fps), C.int(width), C.int(height), C.bool(isColor))
|
||||
return
|
||||
}
|
||||
|
||||
// Close VideoWriter object.
|
||||
func (vw *VideoWriter) Close() error {
|
||||
C.VideoWriter_Close(vw.p)
|
||||
vw.p = nil
|
||||
return nil
|
||||
}
|
||||
|
||||
// IsOpened checks if the VideoWriter is open and ready to be written to.
|
||||
//
|
||||
// For further details, please see:
|
||||
// http://docs.opencv.org/master/dd/d9e/classcv_1_1VideoWriter.html#a9a40803e5f671968ac9efa877c984d75
|
||||
//
|
||||
func (vw *VideoWriter) IsOpened() bool {
|
||||
isOpend := C.VideoWriter_IsOpened(vw.p)
|
||||
return isOpend != 0
|
||||
}
|
||||
|
||||
// Write the next video frame from the Mat image to the open VideoWriter.
|
||||
//
|
||||
// For further details, please see:
|
||||
// http://docs.opencv.org/master/dd/d9e/classcv_1_1VideoWriter.html#a3115b679d612a6a0b5864a0c88ed4b39
|
||||
//
|
||||
func (vw *VideoWriter) Write(img Mat) error {
|
||||
vw.mu.Lock()
|
||||
defer vw.mu.Unlock()
|
||||
C.VideoWriter_Write(vw.p, img.p)
|
||||
return nil
|
||||
}
|
||||
|
||||
// OpenVideoCapture return VideoCapture specified by device ID if v is a
|
||||
// number. Return VideoCapture created from video file, URL, or GStreamer
|
||||
// pipeline if v is a string.
|
||||
func OpenVideoCapture(v interface{}) (*VideoCapture, error) {
|
||||
switch vv := v.(type) {
|
||||
case int:
|
||||
return VideoCaptureDevice(vv)
|
||||
case string:
|
||||
id, err := strconv.Atoi(vv)
|
||||
if err == nil {
|
||||
return VideoCaptureDevice(id)
|
||||
}
|
||||
return VideoCaptureFile(vv)
|
||||
default:
|
||||
return nil, errors.New("argument must be int or string")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user