2019-12-29 17:39:08 +00:00
package gocv
/ *
# include < stdlib . h >
# include "core.h"
* /
import "C"
import (
"errors"
"image"
"image/color"
"reflect"
"unsafe"
)
const (
// MatChannels1 is a single channel Mat.
MatChannels1 = 0
// MatChannels2 is 2 channel Mat.
MatChannels2 = 8
// MatChannels3 is 3 channel Mat.
MatChannels3 = 16
// MatChannels4 is 4 channel Mat.
MatChannels4 = 24
)
// MatType is the type for the various different kinds of Mat you can create.
type MatType int
const (
// MatTypeCV8U is a Mat of 8-bit unsigned int
MatTypeCV8U MatType = 0
// MatTypeCV8S is a Mat of 8-bit signed int
2021-09-02 10:03:56 +00:00
MatTypeCV8S MatType = 1
2019-12-29 17:39:08 +00:00
// MatTypeCV16U is a Mat of 16-bit unsigned int
2021-09-02 10:03:56 +00:00
MatTypeCV16U MatType = 2
2019-12-29 17:39:08 +00:00
// MatTypeCV16S is a Mat of 16-bit signed int
2021-09-02 10:03:56 +00:00
MatTypeCV16S MatType = 3
2019-12-29 17:39:08 +00:00
// MatTypeCV16SC2 is a Mat of 16-bit signed int with 2 channels
MatTypeCV16SC2 = MatTypeCV16S + MatChannels2
// MatTypeCV32S is a Mat of 32-bit signed int
2021-09-02 10:03:56 +00:00
MatTypeCV32S MatType = 4
2019-12-29 17:39:08 +00:00
// MatTypeCV32F is a Mat of 32-bit float
2021-09-02 10:03:56 +00:00
MatTypeCV32F MatType = 5
2019-12-29 17:39:08 +00:00
// MatTypeCV64F is a Mat of 64-bit float
2021-09-02 10:03:56 +00:00
MatTypeCV64F MatType = 6
2019-12-29 17:39:08 +00:00
// MatTypeCV8UC1 is a Mat of 8-bit unsigned int with a single channel
MatTypeCV8UC1 = MatTypeCV8U + MatChannels1
// MatTypeCV8UC2 is a Mat of 8-bit unsigned int with 2 channels
MatTypeCV8UC2 = MatTypeCV8U + MatChannels2
// MatTypeCV8UC3 is a Mat of 8-bit unsigned int with 3 channels
MatTypeCV8UC3 = MatTypeCV8U + MatChannels3
// MatTypeCV8UC4 is a Mat of 8-bit unsigned int with 4 channels
MatTypeCV8UC4 = MatTypeCV8U + MatChannels4
// MatTypeCV8SC1 is a Mat of 8-bit signed int with a single channel
MatTypeCV8SC1 = MatTypeCV8S + MatChannels1
// MatTypeCV8SC2 is a Mat of 8-bit signed int with 2 channels
MatTypeCV8SC2 = MatTypeCV8S + MatChannels2
// MatTypeCV8SC3 is a Mat of 8-bit signed int with 3 channels
MatTypeCV8SC3 = MatTypeCV8S + MatChannels3
// MatTypeCV8SC4 is a Mat of 8-bit signed int with 4 channels
MatTypeCV8SC4 = MatTypeCV8S + MatChannels4
// MatTypeCV16UC1 is a Mat of 16-bit unsigned int with a single channel
MatTypeCV16UC1 = MatTypeCV16U + MatChannels1
// MatTypeCV16UC2 is a Mat of 16-bit unsigned int with 2 channels
MatTypeCV16UC2 = MatTypeCV16U + MatChannels2
// MatTypeCV16UC3 is a Mat of 16-bit unsigned int with 3 channels
MatTypeCV16UC3 = MatTypeCV16U + MatChannels3
// MatTypeCV16UC4 is a Mat of 16-bit unsigned int with 4 channels
MatTypeCV16UC4 = MatTypeCV16U + MatChannels4
// MatTypeCV16SC1 is a Mat of 16-bit signed int with a single channel
MatTypeCV16SC1 = MatTypeCV16S + MatChannels1
// MatTypeCV16SC3 is a Mat of 16-bit signed int with 3 channels
MatTypeCV16SC3 = MatTypeCV16S + MatChannels3
// MatTypeCV16SC4 is a Mat of 16-bit signed int with 4 channels
MatTypeCV16SC4 = MatTypeCV16S + MatChannels4
// MatTypeCV32SC1 is a Mat of 32-bit signed int with a single channel
MatTypeCV32SC1 = MatTypeCV32S + MatChannels1
// MatTypeCV32SC2 is a Mat of 32-bit signed int with 2 channels
MatTypeCV32SC2 = MatTypeCV32S + MatChannels2
// MatTypeCV32SC3 is a Mat of 32-bit signed int with 3 channels
MatTypeCV32SC3 = MatTypeCV32S + MatChannels3
// MatTypeCV32SC4 is a Mat of 32-bit signed int with 4 channels
MatTypeCV32SC4 = MatTypeCV32S + MatChannels4
// MatTypeCV32FC1 is a Mat of 32-bit float int with a single channel
MatTypeCV32FC1 = MatTypeCV32F + MatChannels1
// MatTypeCV32FC2 is a Mat of 32-bit float int with 2 channels
MatTypeCV32FC2 = MatTypeCV32F + MatChannels2
// MatTypeCV32FC3 is a Mat of 32-bit float int with 3 channels
MatTypeCV32FC3 = MatTypeCV32F + MatChannels3
// MatTypeCV32FC4 is a Mat of 32-bit float int with 4 channels
MatTypeCV32FC4 = MatTypeCV32F + MatChannels4
// MatTypeCV64FC1 is a Mat of 64-bit float int with a single channel
MatTypeCV64FC1 = MatTypeCV64F + MatChannels1
// MatTypeCV64FC2 is a Mat of 64-bit float int with 2 channels
MatTypeCV64FC2 = MatTypeCV64F + MatChannels2
// MatTypeCV64FC3 is a Mat of 64-bit float int with 3 channels
MatTypeCV64FC3 = MatTypeCV64F + MatChannels3
// MatTypeCV64FC4 is a Mat of 64-bit float int with 4 channels
MatTypeCV64FC4 = MatTypeCV64F + MatChannels4
)
// CompareType is used for Compare operations to indicate which kind of
// comparison to use.
type CompareType int
const (
// CompareEQ src1 is equal to src2.
CompareEQ CompareType = 0
// CompareGT src1 is greater than src2.
2021-09-02 10:03:56 +00:00
CompareGT CompareType = 1
2019-12-29 17:39:08 +00:00
// CompareGE src1 is greater than or equal to src2.
2021-09-02 10:03:56 +00:00
CompareGE CompareType = 2
2019-12-29 17:39:08 +00:00
// CompareLT src1 is less than src2.
2021-09-02 10:03:56 +00:00
CompareLT CompareType = 3
2019-12-29 17:39:08 +00:00
// CompareLE src1 is less than or equal to src2.
2021-09-02 10:03:56 +00:00
CompareLE CompareType = 4
2019-12-29 17:39:08 +00:00
// CompareNE src1 is unequal to src2.
2021-09-02 10:03:56 +00:00
CompareNE CompareType = 5
2019-12-29 17:39:08 +00:00
)
2021-09-02 10:03:56 +00:00
type Point2f struct {
X float32
Y float32
}
2019-12-29 17:39:08 +00:00
var ErrEmptyByteSlice = errors . New ( "empty byte array" )
// Mat represents an n-dimensional dense numerical single-channel
// or multi-channel array. It can be used to store real or complex-valued
// vectors and matrices, grayscale or color images, voxel volumes,
// vector fields, point clouds, tensors, and histograms.
//
// For further details, please see:
// http://docs.opencv.org/master/d3/d63/classcv_1_1Mat.html
//
type Mat struct {
p C . Mat
2021-09-02 10:03:56 +00:00
// Non-nil if Mat was created with a []byte (using NewMatFromBytes()). Nil otherwise.
d [ ] byte
2019-12-29 17:39:08 +00:00
}
// NewMat returns a new empty Mat.
func NewMat ( ) Mat {
return newMat ( C . Mat_New ( ) )
}
// NewMatWithSize returns a new Mat with a specific size and type.
func NewMatWithSize ( rows int , cols int , mt MatType ) Mat {
return newMat ( C . Mat_NewWithSize ( C . int ( rows ) , C . int ( cols ) , C . int ( mt ) ) )
}
2021-09-02 10:03:56 +00:00
// NewMatWithSizes returns a new multidimensional Mat with a specific size and type.
func NewMatWithSizes ( sizes [ ] int , mt MatType ) Mat {
sizesArray := make ( [ ] C . int , len ( sizes ) )
for i , s := range sizes {
sizesArray [ i ] = C . int ( s )
}
sizesIntVector := C . IntVector {
val : ( * C . int ) ( & sizesArray [ 0 ] ) ,
length : C . int ( len ( sizes ) ) ,
}
return newMat ( C . Mat_NewWithSizes ( sizesIntVector , C . int ( mt ) ) )
}
// NewMatWithSizesWithScalar returns a new multidimensional Mat with a specific size, type and scalar value.
func NewMatWithSizesWithScalar ( sizes [ ] int , mt MatType , s Scalar ) Mat {
csizes := [ ] C . int { }
for _ , v := range sizes {
csizes = append ( csizes , C . int ( v ) )
}
sizesVector := C . struct_IntVector { }
sizesVector . val = ( * C . int ) ( & csizes [ 0 ] )
sizesVector . length = ( C . int ) ( len ( csizes ) )
sVal := C . struct_Scalar {
val1 : C . double ( s . Val1 ) ,
val2 : C . double ( s . Val2 ) ,
val3 : C . double ( s . Val3 ) ,
val4 : C . double ( s . Val4 ) ,
}
return newMat ( C . Mat_NewWithSizesFromScalar ( sizesVector , C . int ( mt ) , sVal ) )
}
// NewMatWithSizesWithScalar returns a new multidimensional Mat with a specific size, type and preexisting data.
func NewMatWithSizesFromBytes ( sizes [ ] int , mt MatType , data [ ] byte ) ( Mat , error ) {
cBytes , err := toByteArray ( data )
if err != nil {
return Mat { } , err
}
csizes := [ ] C . int { }
for _ , v := range sizes {
csizes = append ( csizes , C . int ( v ) )
}
sizesVector := C . struct_IntVector { }
sizesVector . val = ( * C . int ) ( & csizes [ 0 ] )
sizesVector . length = ( C . int ) ( len ( csizes ) )
return newMat ( C . Mat_NewWithSizesFromBytes ( sizesVector , C . int ( mt ) , * cBytes ) ) , nil
}
2019-12-29 17:39:08 +00:00
// NewMatFromScalar returns a new Mat for a specific Scalar value
func NewMatFromScalar ( s Scalar , mt MatType ) Mat {
sVal := C . struct_Scalar {
val1 : C . double ( s . Val1 ) ,
val2 : C . double ( s . Val2 ) ,
val3 : C . double ( s . Val3 ) ,
val4 : C . double ( s . Val4 ) ,
}
return newMat ( C . Mat_NewFromScalar ( sVal , C . int ( mt ) ) )
}
// NewMatWithSizeFromScalar returns a new Mat for a specific Scala value with a specific size and type
// This simplifies creation of specific color filters or creating Mats of specific colors and sizes
func NewMatWithSizeFromScalar ( s Scalar , rows int , cols int , mt MatType ) Mat {
sVal := C . struct_Scalar {
val1 : C . double ( s . Val1 ) ,
val2 : C . double ( s . Val2 ) ,
val3 : C . double ( s . Val3 ) ,
val4 : C . double ( s . Val4 ) ,
}
return newMat ( C . Mat_NewWithSizeFromScalar ( sVal , C . int ( rows ) , C . int ( cols ) , C . int ( mt ) ) )
}
// NewMatFromBytes returns a new Mat with a specific size and type, initialized from a []byte.
func NewMatFromBytes ( rows int , cols int , mt MatType , data [ ] byte ) ( Mat , error ) {
cBytes , err := toByteArray ( data )
if err != nil {
return Mat { } , err
}
2021-09-02 10:03:56 +00:00
mat := newMat ( C . Mat_NewFromBytes ( C . int ( rows ) , C . int ( cols ) , C . int ( mt ) , * cBytes ) )
// Store a reference to the backing data slice. This is needed because we pass the backing
// array directly to C code and without keeping a Go reference to it, it might end up
// garbage collected which would result in crashes.
//
// TODO(bga): This could live in newMat() but I wanted to reduce the change surface.
// TODO(bga): Code that needs access to the array from Go could use this directly.
mat . d = data
return mat , nil
}
// Returns an identity matrix of the specified size and type.
//
// The method returns a Matlab-style identity matrix initializer, similarly to Mat::zeros. Similarly to Mat::ones.
// For further details, please see:
// https://docs.opencv.org/master/d3/d63/classcv_1_1Mat.html#a2cf9b9acde7a9852542bbc20ef851ed2
func Eye ( rows int , cols int , mt MatType ) Mat {
return newMat ( C . Eye ( C . int ( rows ) , C . int ( cols ) , C . int ( mt ) ) )
}
// Returns a zero array of the specified size and type.
//
// The method returns a Matlab-style zero array initializer.
// For further details, please see:
// https://docs.opencv.org/master/d3/d63/classcv_1_1Mat.html#a0b57b6a326c8876d944d188a46e0f556
func Zeros ( rows int , cols int , mt MatType ) Mat {
return newMat ( C . Zeros ( C . int ( rows ) , C . int ( cols ) , C . int ( mt ) ) )
}
// Returns an array of all 1's of the specified size and type.
//
// The method returns a Matlab-style 1's array initializer
// For further details, please see:
// https://docs.opencv.org/master/d3/d63/classcv_1_1Mat.html#a69ae0402d116fc9c71908d8508dc2f09
func Ones ( rows int , cols int , mt MatType ) Mat {
return newMat ( C . Ones ( C . int ( rows ) , C . int ( cols ) , C . int ( mt ) ) )
2019-12-29 17:39:08 +00:00
}
// FromPtr returns a new Mat with a specific size and type, initialized from a Mat Ptr.
func ( m * Mat ) FromPtr ( rows int , cols int , mt MatType , prow int , pcol int ) ( Mat , error ) {
return newMat ( C . Mat_FromPtr ( m . p , C . int ( rows ) , C . int ( cols ) , C . int ( mt ) , C . int ( prow ) , C . int ( pcol ) ) ) , nil
}
// Ptr returns the Mat's underlying object pointer.
func ( m * Mat ) Ptr ( ) C . Mat {
return m . p
}
// Empty determines if the Mat is empty or not.
func ( m * Mat ) Empty ( ) bool {
isEmpty := C . Mat_Empty ( m . p )
return isEmpty != 0
}
2021-09-02 10:03:56 +00:00
// IsContinuous determines if the Mat is continuous.
//
// For further details, please see:
// https://docs.opencv.org/master/d3/d63/classcv_1_1Mat.html#aa90cea495029c7d1ee0a41361ccecdf3
//
func ( m * Mat ) IsContinuous ( ) bool {
return bool ( C . Mat_IsContinuous ( m . p ) )
}
2019-12-29 17:39:08 +00:00
// Clone returns a cloned full copy of the Mat.
func ( m * Mat ) Clone ( ) Mat {
return newMat ( C . Mat_Clone ( m . p ) )
}
// CopyTo copies Mat into destination Mat.
//
// For further details, please see:
// https://docs.opencv.org/master/d3/d63/classcv_1_1Mat.html#a33fd5d125b4c302b0c9aa86980791a77
//
func ( m * Mat ) CopyTo ( dst * Mat ) {
C . Mat_CopyTo ( m . p , dst . p )
return
}
// CopyToWithMask copies Mat into destination Mat after applying the mask Mat.
//
// For further details, please see:
// https://docs.opencv.org/master/d3/d63/classcv_1_1Mat.html#a626fe5f96d02525e2604d2ad46dd574f
//
func ( m * Mat ) CopyToWithMask ( dst * Mat , mask Mat ) {
C . Mat_CopyToWithMask ( m . p , dst . p , mask . p )
return
}
// ConvertTo converts Mat into destination Mat.
//
// For further details, please see:
// https://docs.opencv.org/master/d3/d63/classcv_1_1Mat.html#adf88c60c5b4980e05bb556080916978b
//
func ( m * Mat ) ConvertTo ( dst * Mat , mt MatType ) {
C . Mat_ConvertTo ( m . p , dst . p , C . int ( mt ) )
return
}
2021-09-02 10:03:56 +00:00
func ( m * Mat ) ConvertToWithParams ( dst * Mat , mt MatType , alpha , beta float32 ) {
C . Mat_ConvertToWithParams ( m . p , dst . p , C . int ( mt ) , C . float ( alpha ) , C . float ( beta ) )
return
}
2019-12-29 17:39:08 +00:00
// Total returns the total number of array elements.
//
// For further details, please see:
// https://docs.opencv.org/master/d3/d63/classcv_1_1Mat.html#aa4d317d43fb0cba9c2503f3c61b866c8
//
func ( m * Mat ) Total ( ) int {
return int ( C . Mat_Total ( m . p ) )
}
// Size returns an array with one element for each dimension containing the size of that dimension for the Mat.
//
// For further details, please see:
// https://docs.opencv.org/master/d3/d63/classcv_1_1Mat.html#aa4d317d43fb0cba9c2503f3c61b866c8
//
func ( m * Mat ) Size ( ) ( dims [ ] int ) {
cdims := C . IntVector { }
C . Mat_Size ( m . p , & cdims )
2021-09-02 10:03:56 +00:00
defer C . IntVector_Close ( cdims )
2019-12-29 17:39:08 +00:00
h := & reflect . SliceHeader {
Data : uintptr ( unsafe . Pointer ( cdims . val ) ) ,
Len : int ( cdims . length ) ,
Cap : int ( cdims . length ) ,
}
pdims := * ( * [ ] C . int ) ( unsafe . Pointer ( h ) )
for i := 0 ; i < int ( cdims . length ) ; i ++ {
dims = append ( dims , int ( pdims [ i ] ) )
}
return
}
// ToBytes copies the underlying Mat data to a byte array.
//
// For further details, please see:
// https://docs.opencv.org/3.3.1/d3/d63/classcv_1_1Mat.html#a4d33bed1c850265370d2af0ff02e1564
func ( m * Mat ) ToBytes ( ) [ ] byte {
b := C . Mat_DataPtr ( m . p )
return toGoBytes ( b )
}
// DataPtrUint8 returns a slice that references the OpenCV allocated data.
//
// The data is no longer valid once the Mat has been closed. Any data that
// needs to be accessed after the Mat is closed must be copied into Go memory.
2021-09-02 10:03:56 +00:00
func ( m * Mat ) DataPtrUint8 ( ) ( [ ] uint8 , error ) {
if ! m . IsContinuous ( ) {
return nil , errors . New ( "DataPtrUint8 requires continuous Mat" )
}
2019-12-29 17:39:08 +00:00
p := C . Mat_DataPtr ( m . p )
h := & reflect . SliceHeader {
Data : uintptr ( unsafe . Pointer ( p . data ) ) ,
Len : int ( p . length ) ,
Cap : int ( p . length ) ,
}
2021-09-02 10:03:56 +00:00
return * ( * [ ] uint8 ) ( unsafe . Pointer ( h ) ) , nil
2019-12-29 17:39:08 +00:00
}
// DataPtrInt8 returns a slice that references the OpenCV allocated data.
//
// The data is no longer valid once the Mat has been closed. Any data that
// needs to be accessed after the Mat is closed must be copied into Go memory.
2021-09-02 10:03:56 +00:00
func ( m * Mat ) DataPtrInt8 ( ) ( [ ] int8 , error ) {
if m . Type ( ) & MatTypeCV8S != MatTypeCV8S {
return nil , errors . New ( "DataPtrInt8 only supports MatTypeCV8S" )
}
if ! m . IsContinuous ( ) {
return nil , errors . New ( "DataPtrInt8 requires continuous Mat" )
}
2019-12-29 17:39:08 +00:00
p := C . Mat_DataPtr ( m . p )
h := & reflect . SliceHeader {
Data : uintptr ( unsafe . Pointer ( p . data ) ) ,
Len : int ( p . length ) ,
Cap : int ( p . length ) ,
}
2021-09-02 10:03:56 +00:00
return * ( * [ ] int8 ) ( unsafe . Pointer ( h ) ) , nil
2019-12-29 17:39:08 +00:00
}
// DataPtrUint16 returns a slice that references the OpenCV allocated data.
//
// The data is no longer valid once the Mat has been closed. Any data that
// needs to be accessed after the Mat is closed must be copied into Go memory.
func ( m * Mat ) DataPtrUint16 ( ) ( [ ] uint16 , error ) {
if m . Type ( ) & MatTypeCV16U != MatTypeCV16U {
return nil , errors . New ( "DataPtrUint16 only supports MatTypeCV16U" )
}
2021-09-02 10:03:56 +00:00
if ! m . IsContinuous ( ) {
return nil , errors . New ( "DataPtrUint16 requires continuous Mat" )
}
2019-12-29 17:39:08 +00:00
p := C . Mat_DataPtr ( m . p )
h := & reflect . SliceHeader {
Data : uintptr ( unsafe . Pointer ( p . data ) ) ,
Len : int ( p . length ) / 2 ,
Cap : int ( p . length ) / 2 ,
}
return * ( * [ ] uint16 ) ( unsafe . Pointer ( h ) ) , nil
}
// DataPtrInt16 returns a slice that references the OpenCV allocated data.
//
// The data is no longer valid once the Mat has been closed. Any data that
// needs to be accessed after the Mat is closed must be copied into Go memory.
func ( m * Mat ) DataPtrInt16 ( ) ( [ ] int16 , error ) {
if m . Type ( ) & MatTypeCV16S != MatTypeCV16S {
return nil , errors . New ( "DataPtrInt16 only supports MatTypeCV16S" )
}
2021-09-02 10:03:56 +00:00
if ! m . IsContinuous ( ) {
return nil , errors . New ( "DataPtrInt16 requires continuous Mat" )
}
2019-12-29 17:39:08 +00:00
p := C . Mat_DataPtr ( m . p )
h := & reflect . SliceHeader {
Data : uintptr ( unsafe . Pointer ( p . data ) ) ,
Len : int ( p . length ) / 2 ,
Cap : int ( p . length ) / 2 ,
}
return * ( * [ ] int16 ) ( unsafe . Pointer ( h ) ) , nil
}
// DataPtrFloat32 returns a slice that references the OpenCV allocated data.
//
// The data is no longer valid once the Mat has been closed. Any data that
// needs to be accessed after the Mat is closed must be copied into Go memory.
func ( m * Mat ) DataPtrFloat32 ( ) ( [ ] float32 , error ) {
if m . Type ( ) & MatTypeCV32F != MatTypeCV32F {
return nil , errors . New ( "DataPtrFloat32 only supports MatTypeCV32F" )
}
2021-09-02 10:03:56 +00:00
if ! m . IsContinuous ( ) {
return nil , errors . New ( "DataPtrFloat32 requires continuous Mat" )
}
2019-12-29 17:39:08 +00:00
p := C . Mat_DataPtr ( m . p )
h := & reflect . SliceHeader {
Data : uintptr ( unsafe . Pointer ( p . data ) ) ,
Len : int ( p . length ) / 4 ,
Cap : int ( p . length ) / 4 ,
}
return * ( * [ ] float32 ) ( unsafe . Pointer ( h ) ) , nil
}
// DataPtrFloat64 returns a slice that references the OpenCV allocated data.
//
// The data is no longer valid once the Mat has been closed. Any data that
// needs to be accessed after the Mat is closed must be copied into Go memory.
func ( m * Mat ) DataPtrFloat64 ( ) ( [ ] float64 , error ) {
if m . Type ( ) & MatTypeCV64F != MatTypeCV64F {
return nil , errors . New ( "DataPtrFloat64 only supports MatTypeCV64F" )
}
2021-09-02 10:03:56 +00:00
if ! m . IsContinuous ( ) {
return nil , errors . New ( "DataPtrFloat64 requires continuous Mat" )
}
2019-12-29 17:39:08 +00:00
p := C . Mat_DataPtr ( m . p )
h := & reflect . SliceHeader {
Data : uintptr ( unsafe . Pointer ( p . data ) ) ,
Len : int ( p . length ) / 8 ,
Cap : int ( p . length ) / 8 ,
}
return * ( * [ ] float64 ) ( unsafe . Pointer ( h ) ) , nil
}
// Region returns a new Mat that points to a region of this Mat. Changes made to the
// region Mat will affect the original Mat, since they are pointers to the underlying
// OpenCV Mat object.
func ( m * Mat ) Region ( rio image . Rectangle ) Mat {
cRect := C . struct_Rect {
x : C . int ( rio . Min . X ) ,
y : C . int ( rio . Min . Y ) ,
width : C . int ( rio . Size ( ) . X ) ,
height : C . int ( rio . Size ( ) . Y ) ,
}
return newMat ( C . Mat_Region ( m . p , cRect ) )
}
// Reshape changes the shape and/or the number of channels of a 2D matrix without copying the data.
//
// For further details, please see:
// https://docs.opencv.org/master/d3/d63/classcv_1_1Mat.html#a4eb96e3251417fa88b78e2abd6cfd7d8
//
func ( m * Mat ) Reshape ( cn int , rows int ) Mat {
return newMat ( C . Mat_Reshape ( m . p , C . int ( cn ) , C . int ( rows ) ) )
}
// ConvertFp16 converts a Mat to half-precision floating point.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga9c25d9ef44a2a48ecc3774b30cb80082
//
func ( m * Mat ) ConvertFp16 ( ) Mat {
return newMat ( C . Mat_ConvertFp16 ( m . p ) )
}
// Mean calculates the mean value M of array elements, independently for each channel, and return it as Scalar
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga191389f8a0e58180bb13a727782cd461
//
func ( m * Mat ) Mean ( ) Scalar {
s := C . Mat_Mean ( m . p )
return NewScalar ( float64 ( s . val1 ) , float64 ( s . val2 ) , float64 ( s . val3 ) , float64 ( s . val4 ) )
}
// MeanWithMask calculates the mean value M of array elements,independently for each channel,
// and returns it as Scalar vector while applying the mask.
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga191389f8a0e58180bb13a727782cd461
//
func ( m * Mat ) MeanWithMask ( mask Mat ) Scalar {
s := C . Mat_MeanWithMask ( m . p , mask . p )
return NewScalar ( float64 ( s . val1 ) , float64 ( s . val2 ) , float64 ( s . val3 ) , float64 ( s . val4 ) )
}
// Sqrt calculates a square root of array elements.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga186222c3919657890f88df5a1f64a7d7
//
func ( m * Mat ) Sqrt ( ) Mat {
return newMat ( C . Mat_Sqrt ( m . p ) )
}
// Sum calculates the per-channel pixel sum of an image.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga716e10a2dd9e228e4d3c95818f106722
//
func ( m * Mat ) Sum ( ) Scalar {
s := C . Mat_Sum ( m . p )
return NewScalar ( float64 ( s . val1 ) , float64 ( s . val2 ) , float64 ( s . val3 ) , float64 ( s . val4 ) )
}
// PatchNaNs converts NaN's to zeros.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga62286befb7cde3568ff8c7d14d5079da
//
func ( m * Mat ) PatchNaNs ( ) {
C . Mat_PatchNaNs ( m . p )
}
// LUT performs a look-up table transform of an array.
//
// The function LUT fills the output array with values from the look-up table.
// Indices of the entries are taken from the input array.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#gab55b8d062b7f5587720ede032d34156f
func LUT ( src , wbLUT Mat , dst * Mat ) {
C . LUT ( src . p , wbLUT . p , dst . p )
}
// Rows returns the number of rows for this Mat.
func ( m * Mat ) Rows ( ) int {
return int ( C . Mat_Rows ( m . p ) )
}
// Cols returns the number of columns for this Mat.
func ( m * Mat ) Cols ( ) int {
return int ( C . Mat_Cols ( m . p ) )
}
// Channels returns the number of channels for this Mat.
func ( m * Mat ) Channels ( ) int {
return int ( C . Mat_Channels ( m . p ) )
}
// Type returns the type for this Mat.
func ( m * Mat ) Type ( ) MatType {
return MatType ( C . Mat_Type ( m . p ) )
}
// Step returns the number of bytes each matrix row occupies.
func ( m * Mat ) Step ( ) int {
return int ( C . Mat_Step ( m . p ) )
}
// GetUCharAt returns a value from a specific row/col
// in this Mat expecting it to be of type uchar aka CV_8U.
func ( m * Mat ) GetUCharAt ( row int , col int ) uint8 {
return uint8 ( C . Mat_GetUChar ( m . p , C . int ( row ) , C . int ( col ) ) )
}
// GetUCharAt3 returns a value from a specific x, y, z coordinate location
// in this Mat expecting it to be of type uchar aka CV_8U.
func ( m * Mat ) GetUCharAt3 ( x , y , z int ) uint8 {
return uint8 ( C . Mat_GetUChar3 ( m . p , C . int ( x ) , C . int ( y ) , C . int ( z ) ) )
}
// GetSCharAt returns a value from a specific row/col
// in this Mat expecting it to be of type schar aka CV_8S.
func ( m * Mat ) GetSCharAt ( row int , col int ) int8 {
return int8 ( C . Mat_GetSChar ( m . p , C . int ( row ) , C . int ( col ) ) )
}
// GetSCharAt3 returns a value from a specific x, y, z coordinate location
// in this Mat expecting it to be of type schar aka CV_8S.
func ( m * Mat ) GetSCharAt3 ( x , y , z int ) int8 {
return int8 ( C . Mat_GetSChar3 ( m . p , C . int ( x ) , C . int ( y ) , C . int ( z ) ) )
}
// GetShortAt returns a value from a specific row/col
// in this Mat expecting it to be of type short aka CV_16S.
func ( m * Mat ) GetShortAt ( row int , col int ) int16 {
return int16 ( C . Mat_GetShort ( m . p , C . int ( row ) , C . int ( col ) ) )
}
// GetShortAt3 returns a value from a specific x, y, z coordinate location
// in this Mat expecting it to be of type short aka CV_16S.
func ( m * Mat ) GetShortAt3 ( x , y , z int ) int16 {
return int16 ( C . Mat_GetShort3 ( m . p , C . int ( x ) , C . int ( y ) , C . int ( z ) ) )
}
// GetIntAt returns a value from a specific row/col
// in this Mat expecting it to be of type int aka CV_32S.
func ( m * Mat ) GetIntAt ( row int , col int ) int32 {
return int32 ( C . Mat_GetInt ( m . p , C . int ( row ) , C . int ( col ) ) )
}
// GetIntAt3 returns a value from a specific x, y, z coordinate location
// in this Mat expecting it to be of type int aka CV_32S.
func ( m * Mat ) GetIntAt3 ( x , y , z int ) int32 {
return int32 ( C . Mat_GetInt3 ( m . p , C . int ( x ) , C . int ( y ) , C . int ( z ) ) )
}
// GetFloatAt returns a value from a specific row/col
// in this Mat expecting it to be of type float aka CV_32F.
func ( m * Mat ) GetFloatAt ( row int , col int ) float32 {
return float32 ( C . Mat_GetFloat ( m . p , C . int ( row ) , C . int ( col ) ) )
}
// GetFloatAt3 returns a value from a specific x, y, z coordinate location
// in this Mat expecting it to be of type float aka CV_32F.
func ( m * Mat ) GetFloatAt3 ( x , y , z int ) float32 {
return float32 ( C . Mat_GetFloat3 ( m . p , C . int ( x ) , C . int ( y ) , C . int ( z ) ) )
}
// GetDoubleAt returns a value from a specific row/col
// in this Mat expecting it to be of type double aka CV_64F.
func ( m * Mat ) GetDoubleAt ( row int , col int ) float64 {
return float64 ( C . Mat_GetDouble ( m . p , C . int ( row ) , C . int ( col ) ) )
}
// GetDoubleAt3 returns a value from a specific x, y, z coordinate location
// in this Mat expecting it to be of type double aka CV_64F.
func ( m * Mat ) GetDoubleAt3 ( x , y , z int ) float64 {
return float64 ( C . Mat_GetDouble3 ( m . p , C . int ( x ) , C . int ( y ) , C . int ( z ) ) )
}
// SetTo sets all or some of the array elements to the specified scalar value.
func ( m * Mat ) SetTo ( s Scalar ) {
sVal := C . struct_Scalar {
val1 : C . double ( s . Val1 ) ,
val2 : C . double ( s . Val2 ) ,
val3 : C . double ( s . Val3 ) ,
val4 : C . double ( s . Val4 ) ,
}
C . Mat_SetTo ( m . p , sVal )
}
// SetUCharAt sets a value at a specific row/col
// in this Mat expecting it to be of type uchar aka CV_8U.
func ( m * Mat ) SetUCharAt ( row int , col int , val uint8 ) {
C . Mat_SetUChar ( m . p , C . int ( row ) , C . int ( col ) , C . uint8_t ( val ) )
}
// SetUCharAt3 sets a value at a specific x, y, z coordinate location
// in this Mat expecting it to be of type uchar aka CV_8U.
func ( m * Mat ) SetUCharAt3 ( x , y , z int , val uint8 ) {
C . Mat_SetUChar3 ( m . p , C . int ( x ) , C . int ( y ) , C . int ( z ) , C . uint8_t ( val ) )
}
// SetSCharAt sets a value at a specific row/col
// in this Mat expecting it to be of type schar aka CV_8S.
func ( m * Mat ) SetSCharAt ( row int , col int , val int8 ) {
C . Mat_SetSChar ( m . p , C . int ( row ) , C . int ( col ) , C . int8_t ( val ) )
}
// SetSCharAt3 sets a value at a specific x, y, z coordinate location
// in this Mat expecting it to be of type schar aka CV_8S.
func ( m * Mat ) SetSCharAt3 ( x , y , z int , val int8 ) {
C . Mat_SetSChar3 ( m . p , C . int ( x ) , C . int ( y ) , C . int ( z ) , C . int8_t ( val ) )
}
// SetShortAt sets a value at a specific row/col
// in this Mat expecting it to be of type short aka CV_16S.
func ( m * Mat ) SetShortAt ( row int , col int , val int16 ) {
C . Mat_SetShort ( m . p , C . int ( row ) , C . int ( col ) , C . int16_t ( val ) )
}
// SetShortAt3 sets a value at a specific x, y, z coordinate location
// in this Mat expecting it to be of type short aka CV_16S.
func ( m * Mat ) SetShortAt3 ( x , y , z int , val int16 ) {
C . Mat_SetShort3 ( m . p , C . int ( x ) , C . int ( y ) , C . int ( z ) , C . int16_t ( val ) )
}
// SetIntAt sets a value at a specific row/col
// in this Mat expecting it to be of type int aka CV_32S.
func ( m * Mat ) SetIntAt ( row int , col int , val int32 ) {
C . Mat_SetInt ( m . p , C . int ( row ) , C . int ( col ) , C . int32_t ( val ) )
}
// SetIntAt3 sets a value at a specific x, y, z coordinate location
// in this Mat expecting it to be of type int aka CV_32S.
func ( m * Mat ) SetIntAt3 ( x , y , z int , val int32 ) {
C . Mat_SetInt3 ( m . p , C . int ( x ) , C . int ( y ) , C . int ( z ) , C . int32_t ( val ) )
}
// SetFloatAt sets a value at a specific row/col
// in this Mat expecting it to be of type float aka CV_32F.
func ( m * Mat ) SetFloatAt ( row int , col int , val float32 ) {
C . Mat_SetFloat ( m . p , C . int ( row ) , C . int ( col ) , C . float ( val ) )
}
// SetFloatAt3 sets a value at a specific x, y, z coordinate location
// in this Mat expecting it to be of type float aka CV_32F.
func ( m * Mat ) SetFloatAt3 ( x , y , z int , val float32 ) {
C . Mat_SetFloat3 ( m . p , C . int ( x ) , C . int ( y ) , C . int ( z ) , C . float ( val ) )
}
// SetDoubleAt sets a value at a specific row/col
// in this Mat expecting it to be of type double aka CV_64F.
func ( m * Mat ) SetDoubleAt ( row int , col int , val float64 ) {
C . Mat_SetDouble ( m . p , C . int ( row ) , C . int ( col ) , C . double ( val ) )
}
// SetDoubleAt3 sets a value at a specific x, y, z coordinate location
// in this Mat expecting it to be of type double aka CV_64F.
func ( m * Mat ) SetDoubleAt3 ( x , y , z int , val float64 ) {
C . Mat_SetDouble3 ( m . p , C . int ( x ) , C . int ( y ) , C . int ( z ) , C . double ( val ) )
}
// AddUChar adds a uchar value to each element in the Mat. Performs a
// mat += val operation.
func ( m * Mat ) AddUChar ( val uint8 ) {
C . Mat_AddUChar ( m . p , C . uint8_t ( val ) )
}
// SubtractUChar subtracts a uchar value from each element in the Mat. Performs a
// mat -= val operation.
func ( m * Mat ) SubtractUChar ( val uint8 ) {
C . Mat_SubtractUChar ( m . p , C . uint8_t ( val ) )
}
// MultiplyUChar multiplies each element in the Mat by a uint value. Performs a
// mat *= val operation.
func ( m * Mat ) MultiplyUChar ( val uint8 ) {
C . Mat_MultiplyUChar ( m . p , C . uint8_t ( val ) )
}
// DivideUChar divides each element in the Mat by a uint value. Performs a
// mat /= val operation.
func ( m * Mat ) DivideUChar ( val uint8 ) {
C . Mat_DivideUChar ( m . p , C . uint8_t ( val ) )
}
// AddFloat adds a float value to each element in the Mat. Performs a
// mat += val operation.
func ( m * Mat ) AddFloat ( val float32 ) {
C . Mat_AddFloat ( m . p , C . float ( val ) )
}
// SubtractFloat subtracts a float value from each element in the Mat. Performs a
// mat -= val operation.
func ( m * Mat ) SubtractFloat ( val float32 ) {
C . Mat_SubtractFloat ( m . p , C . float ( val ) )
}
// MultiplyFloat multiplies each element in the Mat by a float value. Performs a
// mat *= val operation.
func ( m * Mat ) MultiplyFloat ( val float32 ) {
C . Mat_MultiplyFloat ( m . p , C . float ( val ) )
}
// DivideFloat divides each element in the Mat by a float value. Performs a
// mat /= val operation.
func ( m * Mat ) DivideFloat ( val float32 ) {
C . Mat_DivideFloat ( m . p , C . float ( val ) )
}
// MultiplyMatrix multiplies matrix (m*x)
func ( m * Mat ) MultiplyMatrix ( x Mat ) Mat {
return newMat ( C . Mat_MultiplyMatrix ( m . p , x . p ) )
}
// T transpose matrix
// https://docs.opencv.org/4.1.2/d3/d63/classcv_1_1Mat.html#aaa428c60ccb6d8ea5de18f63dfac8e11
func ( m * Mat ) T ( ) Mat {
return newMat ( C . Mat_T ( m . p ) )
}
// AbsDiff calculates the per-element absolute difference between two arrays
// or between an array and a scalar.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga6fef31bc8c4071cbc114a758a2b79c14
//
func AbsDiff ( src1 , src2 Mat , dst * Mat ) {
C . Mat_AbsDiff ( src1 . p , src2 . p , dst . p )
}
// Add calculates the per-element sum of two arrays or an array and a scalar.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga10ac1bfb180e2cfda1701d06c24fdbd6
//
func Add ( src1 , src2 Mat , dst * Mat ) {
C . Mat_Add ( src1 . p , src2 . p , dst . p )
}
// AddWeighted calculates the weighted sum of two arrays.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#gafafb2513349db3bcff51f54ee5592a19
//
func AddWeighted ( src1 Mat , alpha float64 , src2 Mat , beta float64 , gamma float64 , dst * Mat ) {
C . Mat_AddWeighted ( src1 . p , C . double ( alpha ) ,
src2 . p , C . double ( beta ) , C . double ( gamma ) , dst . p )
}
// BitwiseAnd computes bitwise conjunction of the two arrays (dst = src1 & src2).
// Calculates the per-element bit-wise conjunction of two arrays
// or an array and a scalar.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga60b4d04b251ba5eb1392c34425497e14
//
func BitwiseAnd ( src1 Mat , src2 Mat , dst * Mat ) {
C . Mat_BitwiseAnd ( src1 . p , src2 . p , dst . p )
}
// BitwiseAndWithMask computes bitwise conjunction of the two arrays (dst = src1 & src2).
// Calculates the per-element bit-wise conjunction of two arrays
// or an array and a scalar. It has an additional parameter for a mask.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga60b4d04b251ba5eb1392c34425497e14
//
func BitwiseAndWithMask ( src1 Mat , src2 Mat , dst * Mat , mask Mat ) {
C . Mat_BitwiseAndWithMask ( src1 . p , src2 . p , dst . p , mask . p )
}
// BitwiseNot inverts every bit of an array.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga0002cf8b418479f4cb49a75442baee2f
//
func BitwiseNot ( src1 Mat , dst * Mat ) {
C . Mat_BitwiseNot ( src1 . p , dst . p )
}
// BitwiseNotWithMask inverts every bit of an array. It has an additional parameter for a mask.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga0002cf8b418479f4cb49a75442baee2f
//
func BitwiseNotWithMask ( src1 Mat , dst * Mat , mask Mat ) {
C . Mat_BitwiseNotWithMask ( src1 . p , dst . p , mask . p )
}
// BitwiseOr calculates the per-element bit-wise disjunction of two arrays
// or an array and a scalar.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#gab85523db362a4e26ff0c703793a719b4
//
func BitwiseOr ( src1 Mat , src2 Mat , dst * Mat ) {
C . Mat_BitwiseOr ( src1 . p , src2 . p , dst . p )
}
// BitwiseOrWithMask calculates the per-element bit-wise disjunction of two arrays
// or an array and a scalar. It has an additional parameter for a mask.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#gab85523db362a4e26ff0c703793a719b4
//
func BitwiseOrWithMask ( src1 Mat , src2 Mat , dst * Mat , mask Mat ) {
C . Mat_BitwiseOrWithMask ( src1 . p , src2 . p , dst . p , mask . p )
}
// BitwiseXor calculates the per-element bit-wise "exclusive or" operation
// on two arrays or an array and a scalar.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga84b2d8188ce506593dcc3f8cd00e8e2c
//
func BitwiseXor ( src1 Mat , src2 Mat , dst * Mat ) {
C . Mat_BitwiseXor ( src1 . p , src2 . p , dst . p )
}
// BitwiseXorWithMask calculates the per-element bit-wise "exclusive or" operation
// on two arrays or an array and a scalar. It has an additional parameter for a mask.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga84b2d8188ce506593dcc3f8cd00e8e2c
//
func BitwiseXorWithMask ( src1 Mat , src2 Mat , dst * Mat , mask Mat ) {
C . Mat_BitwiseXorWithMask ( src1 . p , src2 . p , dst . p , mask . p )
}
// BatchDistance is a naive nearest neighbor finder.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga4ba778a1c57f83233b1d851c83f5a622
//
2021-09-02 10:03:56 +00:00
func BatchDistance ( src1 Mat , src2 Mat , dist Mat , dtype MatType , nidx Mat , normType NormType , K int , mask Mat , update int , crosscheck bool ) {
2019-12-29 17:39:08 +00:00
C . Mat_BatchDistance ( src1 . p , src2 . p , dist . p , C . int ( dtype ) , nidx . p , C . int ( normType ) , C . int ( K ) , mask . p , C . int ( update ) , C . bool ( crosscheck ) )
}
// BorderInterpolate computes the source location of an extrapolated pixel.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga247f571aa6244827d3d798f13892da58
//
func BorderInterpolate ( p int , len int , borderType CovarFlags ) int {
ret := C . Mat_BorderInterpolate ( C . int ( p ) , C . int ( len ) , C . int ( borderType ) )
return int ( ret )
}
// CovarFlags are the covariation flags used by functions such as BorderInterpolate.
//
// For further details, please see:
// https://docs.opencv.org/master/d0/de1/group__core.html#ga719ebd4a73f30f4fab258ab7616d0f0f
//
type CovarFlags int
const (
// CovarScrambled indicates to scramble the results.
CovarScrambled CovarFlags = 0
// CovarNormal indicates to use normal covariation.
2021-09-02 10:03:56 +00:00
CovarNormal CovarFlags = 1
2019-12-29 17:39:08 +00:00
// CovarUseAvg indicates to use average covariation.
2021-09-02 10:03:56 +00:00
CovarUseAvg CovarFlags = 2
2019-12-29 17:39:08 +00:00
// CovarScale indicates to use scaled covariation.
2021-09-02 10:03:56 +00:00
CovarScale CovarFlags = 4
2019-12-29 17:39:08 +00:00
// CovarRows indicates to use covariation on rows.
2021-09-02 10:03:56 +00:00
CovarRows CovarFlags = 8
2019-12-29 17:39:08 +00:00
// CovarCols indicates to use covariation on columns.
2021-09-02 10:03:56 +00:00
CovarCols CovarFlags = 16
2019-12-29 17:39:08 +00:00
)
// CalcCovarMatrix calculates the covariance matrix of a set of vectors.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga017122d912af19d7d0d2cccc2d63819f
//
2021-09-02 10:03:56 +00:00
func CalcCovarMatrix ( samples Mat , covar * Mat , mean * Mat , flags CovarFlags , ctype MatType ) {
2019-12-29 17:39:08 +00:00
C . Mat_CalcCovarMatrix ( samples . p , covar . p , mean . p , C . int ( flags ) , C . int ( ctype ) )
}
// CartToPolar calculates the magnitude and angle of 2D vectors.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#gac5f92f48ec32cacf5275969c33ee837d
//
func CartToPolar ( x Mat , y Mat , magnitude * Mat , angle * Mat , angleInDegrees bool ) {
C . Mat_CartToPolar ( x . p , y . p , magnitude . p , angle . p , C . bool ( angleInDegrees ) )
}
// CheckRange checks every element of an input array for invalid values.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga2bd19d89cae59361416736f87e3c7a64
//
func CheckRange ( src Mat ) bool {
return bool ( C . Mat_CheckRange ( src . p ) )
}
// Compare performs the per-element comparison of two arrays
// or an array and scalar value.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga303cfb72acf8cbb36d884650c09a3a97
//
func Compare ( src1 Mat , src2 Mat , dst * Mat , ct CompareType ) {
C . Mat_Compare ( src1 . p , src2 . p , dst . p , C . int ( ct ) )
}
// CountNonZero counts non-zero array elements.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaa4b89393263bb4d604e0fe5986723914
//
func CountNonZero ( src Mat ) int {
return int ( C . Mat_CountNonZero ( src . p ) )
}
// CompleteSymm copies the lower or the upper half of a square matrix to its another half.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaa9d88dcd0e54b6d1af38d41f2a3e3d25
//
func CompleteSymm ( m Mat , lowerToUpper bool ) {
C . Mat_CompleteSymm ( m . p , C . bool ( lowerToUpper ) )
}
// ConvertScaleAbs scales, calculates absolute values, and converts the result to 8-bit.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga3460e9c9f37b563ab9dd550c4d8c4e7d
//
func ConvertScaleAbs ( src Mat , dst * Mat , alpha float64 , beta float64 ) {
C . Mat_ConvertScaleAbs ( src . p , dst . p , C . double ( alpha ) , C . double ( beta ) )
}
// CopyMakeBorder forms a border around an image (applies padding).
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga2ac1049c2c3dd25c2b41bffe17658a36
//
func CopyMakeBorder ( src Mat , dst * Mat , top int , bottom int , left int , right int , bt BorderType , value color . RGBA ) {
cValue := C . struct_Scalar {
val1 : C . double ( value . B ) ,
val2 : C . double ( value . G ) ,
val3 : C . double ( value . R ) ,
val4 : C . double ( value . A ) ,
}
C . Mat_CopyMakeBorder ( src . p , dst . p , C . int ( top ) , C . int ( bottom ) , C . int ( left ) , C . int ( right ) , C . int ( bt ) , cValue )
}
// DftFlags represents a DFT or DCT flag.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaf4dde112b483b38175621befedda1f1c
//
type DftFlags int
const (
// DftForward performs forward 1D or 2D dft or dct.
DftForward DftFlags = 0
// DftInverse performs an inverse 1D or 2D transform.
2021-09-02 10:03:56 +00:00
DftInverse DftFlags = 1
2019-12-29 17:39:08 +00:00
// DftScale scales the result: divide it by the number of array elements. Normally, it is combined with DFT_INVERSE.
2021-09-02 10:03:56 +00:00
DftScale DftFlags = 2
2019-12-29 17:39:08 +00:00
// DftRows performs a forward or inverse transform of every individual row of the input matrix.
2021-09-02 10:03:56 +00:00
DftRows DftFlags = 4
2019-12-29 17:39:08 +00:00
// DftComplexOutput performs a forward transformation of 1D or 2D real array; the result, though being a complex array, has complex-conjugate symmetry
2021-09-02 10:03:56 +00:00
DftComplexOutput DftFlags = 16
2019-12-29 17:39:08 +00:00
// DftRealOutput performs an inverse transformation of a 1D or 2D complex array; the result is normally a complex array of the same size,
// however, if the input array has conjugate-complex symmetry (for example, it is a result of forward transformation with DFT_COMPLEX_OUTPUT flag),
// the output is a real array.
2021-09-02 10:03:56 +00:00
DftRealOutput DftFlags = 32
2019-12-29 17:39:08 +00:00
// DftComplexInput specifies that input is complex input. If this flag is set, the input must have 2 channels.
2021-09-02 10:03:56 +00:00
DftComplexInput DftFlags = 64
2019-12-29 17:39:08 +00:00
// DctInverse performs an inverse 1D or 2D dct transform.
DctInverse = DftInverse
// DctRows performs a forward or inverse dct transform of every individual row of the input matrix.
DctRows = DftRows
)
// DCT performs a forward or inverse discrete Cosine transform of 1D or 2D array.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga85aad4d668c01fbd64825f589e3696d4
//
func DCT ( src Mat , dst * Mat , flags DftFlags ) {
C . Mat_DCT ( src . p , dst . p , C . int ( flags ) )
}
// Determinant returns the determinant of a square floating-point matrix.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaf802bd9ca3e07b8b6170645ef0611d0c
//
func Determinant ( src Mat ) float64 {
return float64 ( C . Mat_Determinant ( src . p ) )
}
// DFT performs a forward or inverse Discrete Fourier Transform (DFT)
// of a 1D or 2D floating-point array.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#gadd6cf9baf2b8b704a11b5f04aaf4f39d
//
func DFT ( src Mat , dst * Mat , flags DftFlags ) {
C . Mat_DFT ( src . p , dst . p , C . int ( flags ) )
}
// Divide performs the per-element division
// on two arrays or an array and a scalar.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga6db555d30115642fedae0cda05604874
//
func Divide ( src1 Mat , src2 Mat , dst * Mat ) {
C . Mat_Divide ( src1 . p , src2 . p , dst . p )
}
// Eigen calculates eigenvalues and eigenvectors of a symmetric matrix.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga9fa0d58657f60eaa6c71f6fbb40456e3
//
func Eigen ( src Mat , eigenvalues * Mat , eigenvectors * Mat ) bool {
ret := C . Mat_Eigen ( src . p , eigenvalues . p , eigenvectors . p )
return bool ( ret )
}
// EigenNonSymmetric calculates eigenvalues and eigenvectors of a non-symmetric matrix (real eigenvalues only).
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaf51987e03cac8d171fbd2b327cf966f6
//
func EigenNonSymmetric ( src Mat , eigenvalues * Mat , eigenvectors * Mat ) {
C . Mat_EigenNonSymmetric ( src . p , eigenvalues . p , eigenvectors . p )
}
// Exp calculates the exponent of every array element.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga3e10108e2162c338f1b848af619f39e5
//
func Exp ( src Mat , dst * Mat ) {
C . Mat_Exp ( src . p , dst . p )
}
// ExtractChannel extracts a single channel from src (coi is 0-based index).
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#gacc6158574aa1f0281878c955bcf35642
//
func ExtractChannel ( src Mat , dst * Mat , coi int ) {
C . Mat_ExtractChannel ( src . p , dst . p , C . int ( coi ) )
}
// FindNonZero returns the list of locations of non-zero pixels.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaed7df59a3539b4cc0fe5c9c8d7586190
//
func FindNonZero ( src Mat , idx * Mat ) {
C . Mat_FindNonZero ( src . p , idx . p )
}
// Flip flips a 2D array around horizontal(0), vertical(1), or both axes(-1).
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaca7be533e3dac7feb70fc60635adf441
//
func Flip ( src Mat , dst * Mat , flipCode int ) {
C . Mat_Flip ( src . p , dst . p , C . int ( flipCode ) )
}
// Gemm performs generalized matrix multiplication.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#gacb6e64071dffe36434e1e7ee79e7cb35
//
func Gemm ( src1 , src2 Mat , alpha float64 , src3 Mat , beta float64 , dst * Mat , flags int ) {
C . Mat_Gemm ( src1 . p , src2 . p , C . double ( alpha ) , src3 . p , C . double ( beta ) , dst . p , C . int ( flags ) )
}
// GetOptimalDFTSize returns the optimal Discrete Fourier Transform (DFT) size
// for a given vector size.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga6577a2e59968936ae02eb2edde5de299
//
func GetOptimalDFTSize ( vecsize int ) int {
return int ( C . Mat_GetOptimalDFTSize ( C . int ( vecsize ) ) )
}
// Hconcat applies horizontal concatenation to given matrices.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaab5ceee39e0580f879df645a872c6bf7
//
func Hconcat ( src1 , src2 Mat , dst * Mat ) {
C . Mat_Hconcat ( src1 . p , src2 . p , dst . p )
}
// Vconcat applies vertical concatenation to given matrices.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaab5ceee39e0580f879df645a872c6bf7
//
func Vconcat ( src1 , src2 Mat , dst * Mat ) {
C . Mat_Vconcat ( src1 . p , src2 . p , dst . p )
}
// RotateFlag for image rotation
//
//
// For further details please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga6f45d55c0b1cc9d97f5353a7c8a7aac2
type RotateFlag int
const (
// Rotate90Clockwise allows to rotate image 90 degrees clockwise
Rotate90Clockwise RotateFlag = 0
// Rotate180Clockwise allows to rotate image 180 degrees clockwise
2021-09-02 10:03:56 +00:00
Rotate180Clockwise RotateFlag = 1
2019-12-29 17:39:08 +00:00
// Rotate90CounterClockwise allows to rotate 270 degrees clockwise
2021-09-02 10:03:56 +00:00
Rotate90CounterClockwise RotateFlag = 2
2019-12-29 17:39:08 +00:00
)
// Rotate rotates a 2D array in multiples of 90 degrees
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga4ad01c0978b0ce64baa246811deeac24
func Rotate ( src Mat , dst * Mat , code RotateFlag ) {
C . Rotate ( src . p , dst . p , C . int ( code ) )
}
// IDCT calculates the inverse Discrete Cosine Transform of a 1D or 2D array.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga77b168d84e564c50228b69730a227ef2
//
func IDCT ( src Mat , dst * Mat , flags int ) {
C . Mat_Idct ( src . p , dst . p , C . int ( flags ) )
}
// IDFT calculates the inverse Discrete Fourier Transform of a 1D or 2D array.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaa708aa2d2e57a508f968eb0f69aa5ff1
//
func IDFT ( src Mat , dst * Mat , flags , nonzeroRows int ) {
C . Mat_Idft ( src . p , dst . p , C . int ( flags ) , C . int ( nonzeroRows ) )
}
// InRange checks if array elements lie between the elements of two Mat arrays.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga48af0ab51e36436c5d04340e036ce981
//
func InRange ( src , lb , ub Mat , dst * Mat ) {
C . Mat_InRange ( src . p , lb . p , ub . p , dst . p )
}
// InRangeWithScalar checks if array elements lie between the elements of two Scalars
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga48af0ab51e36436c5d04340e036ce981
//
func InRangeWithScalar ( src Mat , lb , ub Scalar , dst * Mat ) {
lbVal := C . struct_Scalar {
val1 : C . double ( lb . Val1 ) ,
val2 : C . double ( lb . Val2 ) ,
val3 : C . double ( lb . Val3 ) ,
val4 : C . double ( lb . Val4 ) ,
}
ubVal := C . struct_Scalar {
val1 : C . double ( ub . Val1 ) ,
val2 : C . double ( ub . Val2 ) ,
val3 : C . double ( ub . Val3 ) ,
val4 : C . double ( ub . Val4 ) ,
}
C . Mat_InRangeWithScalar ( src . p , lbVal , ubVal , dst . p )
}
// InsertChannel inserts a single channel to dst (coi is 0-based index)
// (it replaces channel i with another in dst).
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga1d4bd886d35b00ec0b764cb4ce6eb515
//
func InsertChannel ( src Mat , dst * Mat , coi int ) {
C . Mat_InsertChannel ( src . p , dst . p , C . int ( coi ) )
}
// Invert finds the inverse or pseudo-inverse of a matrix.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#gad278044679d4ecf20f7622cc151aaaa2
//
2021-09-02 10:03:56 +00:00
func Invert ( src Mat , dst * Mat , flags SolveDecompositionFlags ) float64 {
2019-12-29 17:39:08 +00:00
ret := C . Mat_Invert ( src . p , dst . p , C . int ( flags ) )
return float64 ( ret )
}
// KMeansFlags for kmeans center selection
//
// For further details, please see:
// https://docs.opencv.org/master/d0/de1/group__core.html#ga276000efe55ee2756e0c471c7b270949
type KMeansFlags int
const (
// KMeansRandomCenters selects random initial centers in each attempt.
KMeansRandomCenters KMeansFlags = 0
// KMeansPPCenters uses kmeans++ center initialization by Arthur and Vassilvitskii [Arthur2007].
2021-09-02 10:03:56 +00:00
KMeansPPCenters KMeansFlags = 1
2019-12-29 17:39:08 +00:00
// KMeansUseInitialLabels uses the user-supplied lables during the first (and possibly the only) attempt
// instead of computing them from the initial centers. For the second and further attempts, use the random or semi-random // centers. Use one of KMEANS_*_CENTERS flag to specify the exact method.
2021-09-02 10:03:56 +00:00
KMeansUseInitialLabels KMeansFlags = 2
2019-12-29 17:39:08 +00:00
)
// KMeans finds centers of clusters and groups input samples around the clusters.
//
// For further details, please see:
// https://docs.opencv.org/master/d5/d38/group__core__cluster.html#ga9a34dc06c6ec9460e90860f15bcd2f88
//
func KMeans ( data Mat , k int , bestLabels * Mat , criteria TermCriteria , attempts int , flags KMeansFlags , centers * Mat ) float64 {
ret := C . KMeans ( data . p , C . int ( k ) , bestLabels . p , criteria . p , C . int ( attempts ) , C . int ( flags ) , centers . p )
return float64 ( ret )
}
// KMeansPoints finds centers of clusters and groups input samples around the clusters.
//
// For further details, please see:
// https://docs.opencv.org/master/d5/d38/group__core__cluster.html#ga9a34dc06c6ec9460e90860f15bcd2f88
//
2021-09-02 10:03:56 +00:00
func KMeansPoints ( points PointVector , k int , bestLabels * Mat , criteria TermCriteria , attempts int , flags KMeansFlags , centers * Mat ) float64 {
ret := C . KMeansPoints ( points . p , C . int ( k ) , bestLabels . p , criteria . p , C . int ( attempts ) , C . int ( flags ) , centers . p )
2019-12-29 17:39:08 +00:00
return float64 ( ret )
}
// Log calculates the natural logarithm of every array element.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga937ecdce4679a77168730830a955bea7
//
func Log ( src Mat , dst * Mat ) {
C . Mat_Log ( src . p , dst . p )
}
// Magnitude calculates the magnitude of 2D vectors.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga6d3b097586bca4409873d64a90fe64c3
//
func Magnitude ( x , y Mat , magnitude * Mat ) {
C . Mat_Magnitude ( x . p , y . p , magnitude . p )
}
// Max calculates per-element maximum of two arrays or an array and a scalar.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#gacc40fa15eac0fb83f8ca70b7cc0b588d
//
func Max ( src1 , src2 Mat , dst * Mat ) {
C . Mat_Max ( src1 . p , src2 . p , dst . p )
}
// MeanStdDev calculates a mean and standard deviation of array elements.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga846c858f4004d59493d7c6a4354b301d
//
func MeanStdDev ( src Mat , dst * Mat , dstStdDev * Mat ) {
C . Mat_MeanStdDev ( src . p , dst . p , dstStdDev . p )
}
// Merge creates one multi-channel array out of several single-channel ones.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga7d7b4d6c6ee504b30a20b1680029c7b4
//
func Merge ( mv [ ] Mat , dst * Mat ) {
cMatArray := make ( [ ] C . Mat , len ( mv ) )
for i , r := range mv {
cMatArray [ i ] = r . p
}
cMats := C . struct_Mats {
mats : ( * C . Mat ) ( & cMatArray [ 0 ] ) ,
length : C . int ( len ( mv ) ) ,
}
C . Mat_Merge ( cMats , dst . p )
}
// Min calculates per-element minimum of two arrays or an array and a scalar.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga9af368f182ee76d0463d0d8d5330b764
//
func Min ( src1 , src2 Mat , dst * Mat ) {
C . Mat_Min ( src1 . p , src2 . p , dst . p )
}
// MinMaxIdx finds the global minimum and maximum in an array.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga7622c466c628a75d9ed008b42250a73f
//
func MinMaxIdx ( input Mat ) ( minVal , maxVal float32 , minIdx , maxIdx int ) {
var cMinVal C . double
var cMaxVal C . double
var cMinIdx C . int
var cMaxIdx C . int
C . Mat_MinMaxIdx ( input . p , & cMinVal , & cMaxVal , & cMinIdx , & cMaxIdx )
return float32 ( cMinVal ) , float32 ( cMaxVal ) , int ( minIdx ) , int ( maxIdx )
}
// MinMaxLoc finds the global minimum and maximum in an array.
//
// For further details, please see:
// https://docs.opencv.org/trunk/d2/de8/group__core__array.html#gab473bf2eb6d14ff97e89b355dac20707
//
func MinMaxLoc ( input Mat ) ( minVal , maxVal float32 , minLoc , maxLoc image . Point ) {
var cMinVal C . double
var cMaxVal C . double
var cMinLoc C . struct_Point
var cMaxLoc C . struct_Point
C . Mat_MinMaxLoc ( input . p , & cMinVal , & cMaxVal , & cMinLoc , & cMaxLoc )
minLoc = image . Pt ( int ( cMinLoc . x ) , int ( cMinLoc . y ) )
maxLoc = image . Pt ( int ( cMaxLoc . x ) , int ( cMaxLoc . y ) )
return float32 ( cMinVal ) , float32 ( cMaxVal ) , minLoc , maxLoc
}
2021-09-02 10:03:56 +00:00
// Copies specified channels from input arrays to the specified channels of output arrays.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga51d768c270a1cdd3497255017c4504be
//
func MixChannels ( src [ ] Mat , dst [ ] Mat , fromTo [ ] int ) {
cSrcArray := make ( [ ] C . Mat , len ( src ) )
for i , r := range src {
cSrcArray [ i ] = r . p
}
cSrcMats := C . struct_Mats {
mats : ( * C . Mat ) ( & cSrcArray [ 0 ] ) ,
length : C . int ( len ( src ) ) ,
}
cDstArray := make ( [ ] C . Mat , len ( dst ) )
for i , r := range dst {
cDstArray [ i ] = r . p
}
cDstMats := C . struct_Mats {
mats : ( * C . Mat ) ( & cDstArray [ 0 ] ) ,
length : C . int ( len ( dst ) ) ,
}
cFromToArray := make ( [ ] C . int , len ( fromTo ) )
for i , ft := range fromTo {
cFromToArray [ i ] = C . int ( ft )
}
cFromToIntVector := C . IntVector {
val : ( * C . int ) ( & cFromToArray [ 0 ] ) ,
length : C . int ( len ( fromTo ) ) ,
}
C . Mat_MixChannels ( cSrcMats , cDstMats , cFromToIntVector )
for i := C . int ( 0 ) ; i < cDstMats . length ; i ++ {
dst [ i ] . p = C . Mats_get ( cDstMats , i )
}
}
2019-12-29 17:39:08 +00:00
//Mulspectrums performs the per-element multiplication of two Fourier spectrums.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga3ab38646463c59bf0ce962a9d51db64f
//
func MulSpectrums ( a Mat , b Mat , dst * Mat , flags DftFlags ) {
C . Mat_MulSpectrums ( a . p , b . p , dst . p , C . int ( flags ) )
}
// Multiply calculates the per-element scaled product of two arrays.
// Both input arrays must be of the same size and the same type.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga979d898a58d7f61c53003e162e7ad89f
//
func Multiply ( src1 Mat , src2 Mat , dst * Mat ) {
C . Mat_Multiply ( src1 . p , src2 . p , dst . p )
}
2021-09-02 10:03:56 +00:00
// MultiplyWithParams calculates the per-element scaled product of two arrays.
// Both input arrays must be of the same size and the same type.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga979d898a58d7f61c53003e162e7ad89f
//
func MultiplyWithParams ( src1 Mat , src2 Mat , dst * Mat , scale float64 , dtype MatType ) {
C . Mat_MultiplyWithParams ( src1 . p , src2 . p , dst . p , C . double ( scale ) , C . int ( dtype ) )
}
2019-12-29 17:39:08 +00:00
// NormType for normalization operations.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#gad12cefbcb5291cf958a85b4b67b6149f
//
type NormType int
const (
// NormInf indicates use infinite normalization.
NormInf NormType = 1
// NormL1 indicates use L1 normalization.
2021-09-02 10:03:56 +00:00
NormL1 NormType = 2
2019-12-29 17:39:08 +00:00
// NormL2 indicates use L2 normalization.
2021-09-02 10:03:56 +00:00
NormL2 NormType = 4
2019-12-29 17:39:08 +00:00
// NormL2Sqr indicates use L2 squared normalization.
2021-09-02 10:03:56 +00:00
NormL2Sqr NormType = 5
2019-12-29 17:39:08 +00:00
// NormHamming indicates use Hamming normalization.
2021-09-02 10:03:56 +00:00
NormHamming NormType = 6
2019-12-29 17:39:08 +00:00
// NormHamming2 indicates use Hamming 2-bit normalization.
2021-09-02 10:03:56 +00:00
NormHamming2 NormType = 7
2019-12-29 17:39:08 +00:00
// NormTypeMask indicates use type mask for normalization.
2021-09-02 10:03:56 +00:00
NormTypeMask NormType = 7
2019-12-29 17:39:08 +00:00
// NormRelative indicates use relative normalization.
2021-09-02 10:03:56 +00:00
NormRelative NormType = 8
2019-12-29 17:39:08 +00:00
// NormMinMax indicates use min/max normalization.
2021-09-02 10:03:56 +00:00
NormMinMax NormType = 32
2019-12-29 17:39:08 +00:00
)
// Normalize normalizes the norm or value range of an array.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga87eef7ee3970f86906d69a92cbf064bd
//
func Normalize ( src Mat , dst * Mat , alpha float64 , beta float64 , typ NormType ) {
C . Mat_Normalize ( src . p , dst . p , C . double ( alpha ) , C . double ( beta ) , C . int ( typ ) )
}
// Norm calculates the absolute norm of an array.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga7c331fb8dd951707e184ef4e3f21dd33
//
func Norm ( src1 Mat , normType NormType ) float64 {
return float64 ( C . Norm ( src1 . p , C . int ( normType ) ) )
}
2021-09-02 10:03:56 +00:00
// Norm calculates the absolute difference/relative norm of two arrays.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga7c331fb8dd951707e184ef4e3f21dd33
//
func NormWithMats ( src1 Mat , src2 Mat , normType NormType ) float64 {
return float64 ( C . NormWithMats ( src1 . p , src2 . p , C . int ( normType ) ) )
}
2019-12-29 17:39:08 +00:00
// PerspectiveTransform performs the perspective matrix transformation of vectors.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#gad327659ac03e5fd6894b90025e6900a7
//
func PerspectiveTransform ( src Mat , dst * Mat , tm Mat ) {
C . Mat_PerspectiveTransform ( src . p , dst . p , tm . p )
}
// TermCriteriaType for TermCriteria.
//
// For further details, please see:
// https://docs.opencv.org/master/d9/d5d/classcv_1_1TermCriteria.html#a56fecdc291ccaba8aad27d67ccf72c57
//
type TermCriteriaType int
const (
// Count is the maximum number of iterations or elements to compute.
Count TermCriteriaType = 1
// MaxIter is the maximum number of iterations or elements to compute.
2021-09-02 10:03:56 +00:00
MaxIter TermCriteriaType = 1
2019-12-29 17:39:08 +00:00
// EPS is the desired accuracy or change in parameters at which the
// iterative algorithm stops.
2021-09-02 10:03:56 +00:00
EPS TermCriteriaType = 2
2019-12-29 17:39:08 +00:00
)
type SolveDecompositionFlags int
const (
// Gaussian elimination with the optimal pivot element chosen.
2021-09-02 10:03:56 +00:00
SolveDecompositionLu SolveDecompositionFlags = 0
2019-12-29 17:39:08 +00:00
// Singular value decomposition (SVD) method. The system can be over-defined and/or the matrix src1 can be singular.
2021-09-02 10:03:56 +00:00
SolveDecompositionSvd SolveDecompositionFlags = 1
2019-12-29 17:39:08 +00:00
// Eigenvalue decomposition. The matrix src1 must be symmetrical.
2021-09-02 10:03:56 +00:00
SolveDecompositionEing SolveDecompositionFlags = 2
2019-12-29 17:39:08 +00:00
// Cholesky LL^T factorization. The matrix src1 must be symmetrical and positively defined.
2021-09-02 10:03:56 +00:00
SolveDecompositionCholesky SolveDecompositionFlags = 3
2019-12-29 17:39:08 +00:00
// QR factorization. The system can be over-defined and/or the matrix src1 can be singular.
2021-09-02 10:03:56 +00:00
SolveDecompositionQr SolveDecompositionFlags = 4
2019-12-29 17:39:08 +00:00
// While all the previous flags are mutually exclusive, this flag can be used together with any of the previous.
// It means that the normal equations 𝚜 𝚛 𝚌 𝟷 ^T⋅𝚜 𝚛 𝚌 𝟷 ⋅𝚍 𝚜 𝚝 =𝚜 𝚛 𝚌 𝟷 ^T𝚜 𝚛 𝚌 𝟸 are solved instead of the original system
// 𝚜𝚛𝚌𝟷⋅𝚍𝚜𝚝=𝚜 𝚛 𝚌 𝟸 .
2021-09-02 10:03:56 +00:00
SolveDecompositionNormal SolveDecompositionFlags = 5
2019-12-29 17:39:08 +00:00
)
// Solve solves one or more linear systems or least-squares problems.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga12b43690dbd31fed96f213eefead2373
//
func Solve ( src1 Mat , src2 Mat , dst * Mat , flags SolveDecompositionFlags ) bool {
return bool ( C . Mat_Solve ( src1 . p , src2 . p , dst . p , C . int ( flags ) ) )
}
// SolveCubic finds the real roots of a cubic equation.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga1c3b0b925b085b6e96931ee309e6a1da
//
func SolveCubic ( coeffs Mat , roots * Mat ) int {
return int ( C . Mat_SolveCubic ( coeffs . p , roots . p ) )
}
// SolvePoly finds the real or complex roots of a polynomial equation.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#gac2f5e953016fabcdf793d762f4ec5dce
//
func SolvePoly ( coeffs Mat , roots * Mat , maxIters int ) float64 {
return float64 ( C . Mat_SolvePoly ( coeffs . p , roots . p , C . int ( maxIters ) ) )
}
type ReduceTypes int
const (
// The output is the sum of all rows/columns of the matrix.
ReduceSum ReduceTypes = 0
// The output is the mean vector of all rows/columns of the matrix.
ReduceAvg ReduceTypes = 1
// The output is the maximum (column/row-wise) of all rows/columns of the matrix.
ReduceMax ReduceTypes = 2
// The output is the minimum (column/row-wise) of all rows/columns of the matrix.
ReduceMin ReduceTypes = 3
)
// Reduce reduces a matrix to a vector.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga4b78072a303f29d9031d56e5638da78e
//
2021-09-02 10:03:56 +00:00
func Reduce ( src Mat , dst * Mat , dim int , rType ReduceTypes , dType MatType ) {
2019-12-29 17:39:08 +00:00
C . Mat_Reduce ( src . p , dst . p , C . int ( dim ) , C . int ( rType ) , C . int ( dType ) )
}
// Repeat fills the output array with repeated copies of the input array.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga496c3860f3ac44c40b48811333cfda2d
//
func Repeat ( src Mat , nY int , nX int , dst * Mat ) {
C . Mat_Repeat ( src . p , C . int ( nY ) , C . int ( nX ) , dst . p )
}
// Calculates the sum of a scaled array and another array.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga9e0845db4135f55dcf20227402f00d98
//
func ScaleAdd ( src1 Mat , alpha float64 , src2 Mat , dst * Mat ) {
C . Mat_ScaleAdd ( src1 . p , C . double ( alpha ) , src2 . p , dst . p )
}
// SetIdentity initializes a scaled identity matrix.
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga388d7575224a4a277ceb98ccaa327c99
//
func SetIdentity ( src Mat , scalar float64 ) {
C . Mat_SetIdentity ( src . p , C . double ( scalar ) )
}
type SortFlags int
const (
// Each matrix row is sorted independently
SortEveryRow SortFlags = 0
// Each matrix column is sorted independently; this flag and the previous one are mutually exclusive.
SortEveryColumn SortFlags = 1
// Each matrix row is sorted in the ascending order.
SortAscending SortFlags = 0
// Each matrix row is sorted in the descending order; this flag and the previous one are also mutually exclusive.
SortDescending SortFlags = 16
)
// Sort sorts each row or each column of a matrix.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga45dd56da289494ce874be2324856898f
//
func Sort ( src Mat , dst * Mat , flags SortFlags ) {
C . Mat_Sort ( src . p , dst . p , C . int ( flags ) )
}
// SortIdx sorts each row or each column of a matrix.
// Instead of reordering the elements themselves, it stores the indices of sorted elements in the output array
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#gadf35157cbf97f3cb85a545380e383506
//
func SortIdx ( src Mat , dst * Mat , flags SortFlags ) {
C . Mat_SortIdx ( src . p , dst . p , C . int ( flags ) )
}
// Split creates an array of single channel images from a multi-channel image
2021-09-02 10:03:56 +00:00
// Created images should be closed manualy to avoid memory leaks.
2019-12-29 17:39:08 +00:00
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga0547c7fed86152d7e9d0096029c8518a
//
func Split ( src Mat ) ( mv [ ] Mat ) {
cMats := C . struct_Mats { }
C . Mat_Split ( src . p , & ( cMats ) )
2021-09-02 10:03:56 +00:00
defer C . Mats_Close ( cMats )
2019-12-29 17:39:08 +00:00
mv = make ( [ ] Mat , cMats . length )
for i := C . int ( 0 ) ; i < cMats . length ; i ++ {
mv [ i ] . p = C . Mats_get ( cMats , i )
2021-09-02 10:03:56 +00:00
addMatToProfile ( mv [ i ] . p )
2019-12-29 17:39:08 +00:00
}
return
}
// Subtract calculates the per-element subtraction of two arrays or an array and a scalar.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaa0f00d98b4b5edeaeb7b8333b2de353b
//
func Subtract ( src1 Mat , src2 Mat , dst * Mat ) {
C . Mat_Subtract ( src1 . p , src2 . p , dst . p )
}
// Trace returns the trace of a matrix.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga3419ac19c7dcd2be4bd552a23e147dd8
//
func Trace ( src Mat ) Scalar {
s := C . Mat_Trace ( src . p )
return NewScalar ( float64 ( s . val1 ) , float64 ( s . val2 ) , float64 ( s . val3 ) , float64 ( s . val4 ) )
}
// Transform performs the matrix transformation of every array element.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga393164aa54bb9169ce0a8cc44e08ff22
//
func Transform ( src Mat , dst * Mat , tm Mat ) {
C . Mat_Transform ( src . p , dst . p , tm . p )
}
// Transpose transposes a matrix.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga46630ed6c0ea6254a35f447289bd7404
//
func Transpose ( src Mat , dst * Mat ) {
C . Mat_Transpose ( src . p , dst . p )
}
// Pow raises every array element to a power.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaf0d056b5bd1dc92500d6f6cf6bac41ef
//
func Pow ( src Mat , power float64 , dst * Mat ) {
C . Mat_Pow ( src . p , C . double ( power ) , dst . p )
}
// PolatToCart calculates x and y coordinates of 2D vectors from their magnitude and angle.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga581ff9d44201de2dd1b40a50db93d665
//
func PolarToCart ( magnitude Mat , degree Mat , x * Mat , y * Mat , angleInDegrees bool ) {
C . Mat_PolarToCart ( magnitude . p , degree . p , x . p , y . p , C . bool ( angleInDegrees ) )
}
// Phase calculates the rotation angle of 2D vectors.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga9db9ca9b4d81c3bde5677b8f64dc0137
//
func Phase ( x , y Mat , angle * Mat , angleInDegrees bool ) {
C . Mat_Phase ( x . p , y . p , angle . p , C . bool ( angleInDegrees ) )
}
// TermCriteria is the criteria for iterative algorithms.
//
// For further details, please see:
// https://docs.opencv.org/master/d9/d5d/classcv_1_1TermCriteria.html
//
type TermCriteria struct {
p C . TermCriteria
}
// NewTermCriteria returns a new TermCriteria.
func NewTermCriteria ( typ TermCriteriaType , maxCount int , epsilon float64 ) TermCriteria {
return TermCriteria { p : C . TermCriteria_New ( C . int ( typ ) , C . int ( maxCount ) , C . double ( epsilon ) ) }
}
// Scalar is a 4-element vector widely used in OpenCV to pass pixel values.
//
// For further details, please see:
// http://docs.opencv.org/master/d1/da0/classcv_1_1Scalar__.html
//
type Scalar struct {
Val1 float64
Val2 float64
Val3 float64
Val4 float64
}
// NewScalar returns a new Scalar. These are usually colors typically being in BGR order.
func NewScalar ( v1 float64 , v2 float64 , v3 float64 , v4 float64 ) Scalar {
s := Scalar { Val1 : v1 , Val2 : v2 , Val3 : v3 , Val4 : v4 }
return s
}
// KeyPoint is data structure for salient point detectors.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/d29/classcv_1_1KeyPoint.html
//
type KeyPoint struct {
X , Y float64
Size , Angle , Response float64
Octave , ClassID int
}
// DMatch is data structure for matching keypoint descriptors.
//
// For further details, please see:
// https://docs.opencv.org/master/d4/de0/classcv_1_1DMatch.html#a546ddb9a87898f06e510e015a6de596e
//
type DMatch struct {
QueryIdx int
TrainIdx int
ImgIdx int
Distance float64
}
2021-09-02 10:03:56 +00:00
// Vecb is a generic vector of bytes.
type Vecb [ ] uint8
// GetVecbAt returns a vector of bytes. Its size corresponds to the number
// of channels of the Mat.
func ( m * Mat ) GetVecbAt ( row int , col int ) Vecb {
ch := m . Channels ( )
v := make ( Vecb , ch )
for c := 0 ; c < ch ; c ++ {
v [ c ] = m . GetUCharAt ( row , col * ch + c )
}
return v
}
2019-12-29 17:39:08 +00:00
// Vecf is a generic vector of floats.
type Vecf [ ] float32
// GetVecfAt returns a vector of floats. Its size corresponds to the number of
// channels of the Mat.
func ( m * Mat ) GetVecfAt ( row int , col int ) Vecf {
ch := m . Channels ( )
v := make ( Vecf , ch )
for c := 0 ; c < ch ; c ++ {
v [ c ] = m . GetFloatAt ( row , col * ch + c )
}
return v
}
2021-09-02 10:03:56 +00:00
// Vecd is a generic vector of float64/doubles.
type Vecd [ ] float64
// GetVecdAt returns a vector of float64s. Its size corresponds to the number
// of channels of the Mat.
func ( m * Mat ) GetVecdAt ( row int , col int ) Vecd {
ch := m . Channels ( )
v := make ( Vecd , ch )
for c := 0 ; c < ch ; c ++ {
v [ c ] = m . GetDoubleAt ( row , col * ch + c )
}
return v
}
2019-12-29 17:39:08 +00:00
// Veci is a generic vector of integers.
type Veci [ ] int32
// GetVeciAt returns a vector of integers. Its size corresponds to the number
// of channels of the Mat.
func ( m * Mat ) GetVeciAt ( row int , col int ) Veci {
ch := m . Channels ( )
v := make ( Veci , ch )
for c := 0 ; c < ch ; c ++ {
v [ c ] = m . GetIntAt ( row , col * ch + c )
}
return v
}
2021-09-02 10:03:56 +00:00
// PointVector is a wrapper around a std::vector< cv::Point >*
// This is needed anytime that you need to pass or receive a collection of points.
type PointVector struct {
p C . PointVector
}
// NewPointVector returns a new empty PointVector.
func NewPointVector ( ) PointVector {
return PointVector { p : C . PointVector_New ( ) }
}
// NewPointVectorFromPoints returns a new PointVector that has been
// initialized to a slice of image.Point.
func NewPointVectorFromPoints ( pts [ ] image . Point ) PointVector {
p := ( * C . struct_Point ) ( C . malloc ( C . size_t ( C . sizeof_struct_Point * len ( pts ) ) ) )
defer C . free ( unsafe . Pointer ( p ) )
h := & reflect . SliceHeader {
Data : uintptr ( unsafe . Pointer ( p ) ) ,
Len : len ( pts ) ,
Cap : len ( pts ) ,
}
pa := * ( * [ ] C . Point ) ( unsafe . Pointer ( h ) )
for j , point := range pts {
pa [ j ] = C . struct_Point {
x : C . int ( point . X ) ,
y : C . int ( point . Y ) ,
}
}
cpoints := C . struct_Points {
points : ( * C . Point ) ( p ) ,
length : C . int ( len ( pts ) ) ,
}
return PointVector { p : C . PointVector_NewFromPoints ( cpoints ) }
}
// NewPointVectorFromMat returns a new PointVector that has been
// wrapped around a Mat of type CV_32SC2 with a single columm.
func NewPointVectorFromMat ( mat Mat ) PointVector {
return PointVector { p : C . PointVector_NewFromMat ( mat . p ) }
}
// IsNil checks the CGo pointer in the PointVector.
func ( pv PointVector ) IsNil ( ) bool {
return pv . p == nil
}
// Size returns how many Point are in the PointVector.
func ( pv PointVector ) Size ( ) int {
return int ( C . PointVector_Size ( pv . p ) )
}
// At returns the image.Point
func ( pv PointVector ) At ( idx int ) image . Point {
if idx > pv . Size ( ) {
return image . Point { }
}
cp := C . PointVector_At ( pv . p , C . int ( idx ) )
return image . Pt ( int ( cp . x ) , int ( cp . y ) )
}
// Append appends an image.Point at end of the PointVector.
func ( pv PointVector ) Append ( point image . Point ) {
p := C . struct_Point {
x : C . int ( point . X ) ,
y : C . int ( point . Y ) ,
}
C . PointVector_Append ( pv . p , p )
return
}
// ToPoints returns a slice of image.Point for the data in this PointVector.
func ( pv PointVector ) ToPoints ( ) [ ] image . Point {
points := make ( [ ] image . Point , pv . Size ( ) )
for j := 0 ; j < pv . Size ( ) ; j ++ {
points [ j ] = pv . At ( j )
}
return points
}
// Close closes and frees memory for this PointVector.
func ( pv PointVector ) Close ( ) {
C . PointVector_Close ( pv . p )
}
// PointsVector is a wrapper around a std::vector< std::vector< cv::Point > >*
type PointsVector struct {
p C . PointsVector
}
// NewPointsVector returns a new empty PointsVector.
func NewPointsVector ( ) PointsVector {
return PointsVector { p : C . PointsVector_New ( ) }
}
// NewPointsVectorFromPoints returns a new PointsVector that has been
// initialized to a slice of slices of image.Point.
func NewPointsVectorFromPoints ( pts [ ] [ ] image . Point ) PointsVector {
points := make ( [ ] C . struct_Points , len ( pts ) )
for i , pt := range pts {
p := ( * C . struct_Point ) ( C . malloc ( C . size_t ( C . sizeof_struct_Point * len ( pt ) ) ) )
defer C . free ( unsafe . Pointer ( p ) )
h := & reflect . SliceHeader {
Data : uintptr ( unsafe . Pointer ( p ) ) ,
Len : len ( pt ) ,
Cap : len ( pt ) ,
}
pa := * ( * [ ] C . Point ) ( unsafe . Pointer ( h ) )
for j , point := range pt {
pa [ j ] = C . struct_Point {
x : C . int ( point . X ) ,
y : C . int ( point . Y ) ,
}
}
points [ i ] = C . struct_Points {
points : ( * C . Point ) ( p ) ,
length : C . int ( len ( pt ) ) ,
}
}
cPoints := C . struct_Contours {
contours : ( * C . struct_Points ) ( & points [ 0 ] ) ,
length : C . int ( len ( pts ) ) ,
}
return PointsVector { p : C . PointsVector_NewFromPoints ( cPoints ) }
}
// ToPoints returns a slice of slices of image.Point for the data in this PointsVector.
func ( pvs PointsVector ) ToPoints ( ) [ ] [ ] image . Point {
ppoints := make ( [ ] [ ] image . Point , pvs . Size ( ) )
for i := 0 ; i < pvs . Size ( ) ; i ++ {
pts := pvs . At ( i )
points := make ( [ ] image . Point , pts . Size ( ) )
for j := 0 ; j < pts . Size ( ) ; j ++ {
points [ j ] = pts . At ( j )
}
ppoints [ i ] = points
}
return ppoints
}
// IsNil checks the CGo pointer in the PointsVector.
func ( pvs PointsVector ) IsNil ( ) bool {
return pvs . p == nil
}
// Size returns how many vectors of Points are in the PointsVector.
func ( pvs PointsVector ) Size ( ) int {
return int ( C . PointsVector_Size ( pvs . p ) )
}
// At returns the PointVector at that index of the PointsVector.
func ( pvs PointsVector ) At ( idx int ) PointVector {
if idx > pvs . Size ( ) {
return PointVector { }
}
return PointVector { p : C . PointsVector_At ( pvs . p , C . int ( idx ) ) }
}
// Append appends a PointVector at end of the PointsVector.
func ( pvs PointsVector ) Append ( pv PointVector ) {
if ! pv . IsNil ( ) {
C . PointsVector_Append ( pvs . p , pv . p )
}
return
}
// Close closes and frees memory for this PointsVector.
func ( pvs PointsVector ) Close ( ) {
C . PointsVector_Close ( pvs . p )
}
// Point2fVector is a wrapper around a std::vector< cv::Point2f >*
// This is needed anytime that you need to pass or receive a collection of points.
type Point2fVector struct {
p C . Point2fVector
}
// NewPoint2fVector returns a new empty Point2fVector.
func NewPoint2fVector ( ) Point2fVector {
return Point2fVector { p : C . Point2fVector_New ( ) }
}
// NewPoint2fVectorFromPoints returns a new Point2fVector that has been
// initialized to a slice of image.Point.
func NewPoint2fVectorFromPoints ( pts [ ] Point2f ) Point2fVector {
p := ( * C . struct_Point2f ) ( C . malloc ( C . size_t ( C . sizeof_struct_Point2f * len ( pts ) ) ) )
defer C . free ( unsafe . Pointer ( p ) )
h := & reflect . SliceHeader {
Data : uintptr ( unsafe . Pointer ( p ) ) ,
Len : len ( pts ) ,
Cap : len ( pts ) ,
}
pa := * ( * [ ] C . Point2f ) ( unsafe . Pointer ( h ) )
for j , point := range pts {
pa [ j ] = C . struct_Point2f {
x : C . float ( point . X ) ,
y : C . float ( point . Y ) ,
}
}
cpoints := C . struct_Points2f {
points : ( * C . Point2f ) ( p ) ,
length : C . int ( len ( pts ) ) ,
}
return Point2fVector { p : C . Point2fVector_NewFromPoints ( cpoints ) }
}
// NewPoint2fVectorFromMat returns a new Point2fVector that has been
// wrapped around a Mat of type CV_32FC2 with a single columm.
func NewPoint2fVectorFromMat ( mat Mat ) Point2fVector {
return Point2fVector { p : C . Point2fVector_NewFromMat ( mat . p ) }
}
// IsNil checks the CGo pointer in the Point2fVector.
func ( pfv Point2fVector ) IsNil ( ) bool {
return pfv . p == nil
}
// Size returns how many Point are in the PointVector.
func ( pfv Point2fVector ) Size ( ) int {
return int ( C . Point2fVector_Size ( pfv . p ) )
}
// At returns the image.Point
func ( pfv Point2fVector ) At ( idx int ) Point2f {
if idx > pfv . Size ( ) {
return Point2f { }
}
cp := C . Point2fVector_At ( pfv . p , C . int ( idx ) )
return Point2f { float32 ( cp . x ) , float32 ( cp . y ) }
}
// ToPoints returns a slice of image.Point for the data in this PointVector.
func ( pfv Point2fVector ) ToPoints ( ) [ ] Point2f {
points := make ( [ ] Point2f , pfv . Size ( ) )
for j := 0 ; j < pfv . Size ( ) ; j ++ {
points [ j ] = pfv . At ( j )
}
return points
}
// Close closes and frees memory for this Point2fVector.
func ( pfv Point2fVector ) Close ( ) {
C . Point2fVector_Close ( pfv . p )
}
2019-12-29 17:39:08 +00:00
// GetTickCount returns the number of ticks.
//
// For further details, please see:
// https://docs.opencv.org/master/db/de0/group__core__utils.html#gae73f58000611a1af25dd36d496bf4487
//
func GetTickCount ( ) float64 {
return float64 ( C . GetCVTickCount ( ) )
}
// GetTickFrequency returns the number of ticks per second.
//
// For further details, please see:
// https://docs.opencv.org/master/db/de0/group__core__utils.html#ga705441a9ef01f47acdc55d87fbe5090c
//
func GetTickFrequency ( ) float64 {
return float64 ( C . GetTickFrequency ( ) )
}
func toByteArray ( b [ ] byte ) ( * C . struct_ByteArray , error ) {
if len ( b ) == 0 {
return nil , ErrEmptyByteSlice
}
return & C . struct_ByteArray {
data : ( * C . char ) ( unsafe . Pointer ( & b [ 0 ] ) ) ,
length : C . int ( len ( b ) ) ,
} , nil
}
func toGoBytes ( b C . struct_ByteArray ) [ ] byte {
return C . GoBytes ( unsafe . Pointer ( b . data ) , b . length )
}
2021-09-02 10:03:56 +00:00
// Converts CStrings to a slice of Go strings even when the C strings are not contiguous in memory
func toGoStrings ( strs C . CStrings ) [ ] string {
length := int ( strs . length )
tmpslice := ( * [ 1 << 20 ] * C . char ) ( unsafe . Pointer ( strs . strs ) ) [ : length : length ]
gostrings := make ( [ ] string , length )
for i , s := range tmpslice {
gostrings [ i ] = C . GoString ( s )
}
return gostrings
}
2019-12-29 17:39:08 +00:00
func toRectangles ( ret C . Rects ) [ ] image . Rectangle {
cArray := ret . rects
length := int ( ret . length )
hdr := reflect . SliceHeader {
Data : uintptr ( unsafe . Pointer ( cArray ) ) ,
Len : length ,
Cap : length ,
}
s := * ( * [ ] C . Rect ) ( unsafe . Pointer ( & hdr ) )
rects := make ( [ ] image . Rectangle , length )
for i , r := range s {
rects [ i ] = image . Rect ( int ( r . x ) , int ( r . y ) , int ( r . x + r . width ) , int ( r . y + r . height ) )
}
return rects
}
func toRect ( rect C . Rect ) image . Rectangle {
return image . Rect ( int ( rect . x ) , int ( rect . y ) , int ( rect . x + rect . width ) , int ( rect . y + rect . height ) )
}
func toCPoints ( points [ ] image . Point ) C . struct_Points {
cPointSlice := make ( [ ] C . struct_Point , len ( points ) )
for i , point := range points {
cPointSlice [ i ] = C . struct_Point {
x : C . int ( point . X ) ,
y : C . int ( point . Y ) ,
}
}
return C . struct_Points {
points : ( * C . Point ) ( & cPointSlice [ 0 ] ) ,
length : C . int ( len ( points ) ) ,
}
}
2021-09-02 10:03:56 +00:00
func toCPoints2f ( points [ ] Point2f ) C . struct_Points2f {
cPointSlice := make ( [ ] C . struct_Point2f , len ( points ) )
for i , point := range points {
cPointSlice [ i ] = C . struct_Point2f {
x : C . float ( point . X ) ,
y : C . float ( point . Y ) ,
}
}
return C . struct_Points2f {
points : ( * C . Point2f ) ( & cPointSlice [ 0 ] ) ,
length : C . int ( len ( points ) ) ,
}
}
2019-12-29 17:39:08 +00:00
func toCStrings ( strs [ ] string ) C . struct_CStrings {
cStringsSlice := make ( [ ] * C . char , len ( strs ) )
for i , s := range strs {
cStringsSlice [ i ] = C . CString ( s )
}
return C . struct_CStrings {
strs : ( * * C . char ) ( & cStringsSlice [ 0 ] ) ,
length : C . int ( len ( strs ) ) ,
}
}
// RowRange creates a matrix header for the specified row span.
//
// For further details, please see:
// https://docs.opencv.org/master/d3/d63/classcv_1_1Mat.html#aa6542193430356ad631a9beabc624107
//
func ( m * Mat ) RowRange ( start , end int ) Mat {
return newMat ( C . Mat_rowRange ( m . p , C . int ( start ) , C . int ( end ) ) )
}
// ColRange creates a matrix header for the specified column span.
//
// For further details, please see:
// https://docs.opencv.org/master/d3/d63/classcv_1_1Mat.html#aadc8f9210fe4dec50513746c246fa8d9
//
func ( m * Mat ) ColRange ( start , end int ) Mat {
return newMat ( C . Mat_colRange ( m . p , C . int ( start ) , C . int ( end ) ) )
}
2021-09-02 10:03:56 +00:00
// RNG Random Number Generator.
// It encapsulates the state (currently, a 64-bit integer) and
// has methods to return scalar random values and to fill arrays
// with random values
//
// For further details, please see:
// https://docs.opencv.org/master/d1/dd6/classcv_1_1RNG.html
//
type RNG struct {
p C . RNG
}
type RNGDistType int
const (
// Uniform distribution
RNGDistUniform RNGDistType = 0
// Normal distribution
RNGDistNormal RNGDistType = 1
)
// TheRNG Returns the default random number generator.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga75843061d150ad6564b5447e38e57722
//
func TheRNG ( ) RNG {
return RNG {
p : C . TheRNG ( ) ,
}
}
// TheRNG Sets state of default random number generator.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga757e657c037410d9e19e819569e7de0f
//
func SetRNGSeed ( seed int ) {
C . SetRNGSeed ( C . int ( seed ) )
}
// Fill Fills arrays with random numbers.
//
// For further details, please see:
// https://docs.opencv.org/master/d1/dd6/classcv_1_1RNG.html#ad26f2b09d9868cf108e84c9814aa682d
//
func ( r * RNG ) Fill ( mat * Mat , distType RNGDistType , a , b float64 , saturateRange bool ) {
C . RNG_Fill ( r . p , mat . p , C . int ( distType ) , C . double ( a ) , C . double ( b ) , C . bool ( saturateRange ) )
}
// Gaussian Returns the next random number sampled from
// the Gaussian distribution.
//
// For further details, please see:
// https://docs.opencv.org/master/d1/dd6/classcv_1_1RNG.html#a8df8ce4dc7d15916cee743e5a884639d
//
func ( r * RNG ) Gaussian ( sigma float64 ) float64 {
return float64 ( C . RNG_Gaussian ( r . p , C . double ( sigma ) ) )
}
// Next The method updates the state using the MWC algorithm
// and returns the next 32-bit random number.
//
// For further details, please see:
// https://docs.opencv.org/master/d1/dd6/classcv_1_1RNG.html#a8df8ce4dc7d15916cee743e5a884639d
//
func ( r * RNG ) Next ( ) uint {
return uint ( C . RNG_Next ( r . p ) )
}
// RandN Fills the array with normally distributed random numbers.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#gaeff1f61e972d133a04ce3a5f81cf6808
//
func RandN ( mat * Mat , mean , stddev Scalar ) {
meanVal := C . struct_Scalar {
val1 : C . double ( mean . Val1 ) ,
val2 : C . double ( mean . Val2 ) ,
val3 : C . double ( mean . Val3 ) ,
val4 : C . double ( mean . Val4 ) ,
}
stddevVal := C . struct_Scalar {
val1 : C . double ( stddev . Val1 ) ,
val2 : C . double ( stddev . Val2 ) ,
val3 : C . double ( stddev . Val3 ) ,
val4 : C . double ( stddev . Val4 ) ,
}
C . RandN ( mat . p , meanVal , stddevVal )
}
// RandShuffle Shuffles the array elements randomly.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga6a789c8a5cb56c6dd62506179808f763
//
func RandShuffle ( mat * Mat ) {
C . RandShuffle ( mat . p )
}
// RandShuffleWithParams Shuffles the array elements randomly.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga6a789c8a5cb56c6dd62506179808f763
//
func RandShuffleWithParams ( mat * Mat , iterFactor float64 , rng RNG ) {
C . RandShuffleWithParams ( mat . p , C . double ( iterFactor ) , rng . p )
}
// RandU Generates a single uniformly-distributed random
// number or an array of random numbers.
//
// For further details, please see:
// https://docs.opencv.org/master/d2/de8/group__core__array.html#ga1ba1026dca0807b27057ba6a49d258c0
//
func RandU ( mat * Mat , low , high Scalar ) {
lowVal := C . struct_Scalar {
val1 : C . double ( low . Val1 ) ,
val2 : C . double ( low . Val2 ) ,
val3 : C . double ( low . Val3 ) ,
val4 : C . double ( low . Val4 ) ,
}
highVal := C . struct_Scalar {
val1 : C . double ( high . Val1 ) ,
val2 : C . double ( high . Val2 ) ,
val3 : C . double ( high . Val3 ) ,
val4 : C . double ( high . Val4 ) ,
}
C . RandU ( mat . p , lowVal , highVal )
}
type NativeByteBuffer struct {
// std::vector is build of 3 pointers And this will not change ever.
stdVectorOpaq [ 3 ] uintptr
}
func newNativeByteBuffer ( ) * NativeByteBuffer {
buffer := & NativeByteBuffer { }
C . StdByteVectorInitialize ( buffer . nativePointer ( ) )
return buffer
}
func ( buffer * NativeByteBuffer ) nativePointer ( ) unsafe . Pointer {
return unsafe . Pointer ( & buffer . stdVectorOpaq [ 0 ] )
}
func ( buffer * NativeByteBuffer ) dataPointer ( ) unsafe . Pointer {
return unsafe . Pointer ( C . StdByteVectorData ( buffer . nativePointer ( ) ) )
}
// GetBytes returns slice of bytes backed by native buffer
func ( buffer * NativeByteBuffer ) GetBytes ( ) [ ] byte {
var result [ ] byte
sliceHeader := ( * reflect . SliceHeader ) ( unsafe . Pointer ( & result ) )
vectorLen := int ( C . StdByteVectorLen ( buffer . nativePointer ( ) ) )
sliceHeader . Cap = vectorLen
sliceHeader . Len = vectorLen
sliceHeader . Data = uintptr ( buffer . dataPointer ( ) )
return result
}
// Len - returns length in bytes of underlying buffer
func ( buffer * NativeByteBuffer ) Len ( ) int {
return int ( C . StdByteVectorLen ( buffer . nativePointer ( ) ) )
}
// Close the buffer releasing all its resources
func ( buffer * NativeByteBuffer ) Close ( ) {
C . StdByteVectorFree ( buffer . nativePointer ( ) )
}