mirror of
https://github.com/hybridgroup/gocv
synced 2025-08-25 08:41:04 +08:00
94 lines
2.6 KiB
Go
94 lines
2.6 KiB
Go
package gocv
|
|
|
|
/*
|
|
#include <stdlib.h>
|
|
#include "dnn.h"
|
|
*/
|
|
import "C"
|
|
import (
|
|
"image"
|
|
"unsafe"
|
|
)
|
|
|
|
// Net allows you to create and manipulate comprehensive artificial neural networks.
|
|
//
|
|
// For further details, please see:
|
|
// https://docs.opencv.org/3.4.0/db/d30/classcv_1_1dnn_1_1Net.html
|
|
//
|
|
type Net struct {
|
|
// C.Net
|
|
p unsafe.Pointer
|
|
}
|
|
|
|
// Empty returns true if there are no layers in the network.
|
|
//
|
|
// For further details, please see:
|
|
// https://docs.opencv.org/3.4.0/db/d30/classcv_1_1dnn_1_1Net.html#a6a5778787d5b8770deab5eda6968e66c
|
|
//
|
|
func (net *Net) Empty() bool {
|
|
return bool(C.Net_Empty((C.Net)(net.p)))
|
|
}
|
|
|
|
// SetInput sets the new value for the layer output blob.
|
|
//
|
|
// For further details, please see:
|
|
// https://docs.opencv.org/trunk/db/d30/classcv_1_1dnn_1_1Net.html#a672a08ae76444d75d05d7bfea3e4a328
|
|
//
|
|
func (net *Net) SetInput(blob Mat, name string) {
|
|
cName := C.CString(name)
|
|
defer C.free(unsafe.Pointer(cName))
|
|
|
|
C.Net_SetInput((C.Net)(net.p), blob.p, cName)
|
|
}
|
|
|
|
// Forward runs forward pass to compute output of layer with name outputName.
|
|
//
|
|
// For further details, please see:
|
|
// https://docs.opencv.org/trunk/db/d30/classcv_1_1dnn_1_1Net.html#a98ed94cb6ef7063d3697259566da310b
|
|
//
|
|
func (net *Net) Forward(outputName string) Mat {
|
|
cName := C.CString(outputName)
|
|
defer C.free(unsafe.Pointer(cName))
|
|
|
|
return Mat{p: C.Net_Forward((C.Net)(net.p), cName)}
|
|
}
|
|
|
|
// ReadNetFromCaffe reads a network model stored in Caffe framework's format.
|
|
//
|
|
// For further details, please see:
|
|
// https://docs.opencv.org/3.4.0/d6/d0f/group__dnn.html#ga946b342af1355185a7107640f868b64a
|
|
//
|
|
func ReadNetFromCaffe(prototxt string, caffeModel string) Net {
|
|
cprototxt := C.CString(prototxt)
|
|
defer C.free(unsafe.Pointer(cprototxt))
|
|
|
|
cmodel := C.CString(caffeModel)
|
|
defer C.free(unsafe.Pointer(cmodel))
|
|
return Net{p: unsafe.Pointer(C.Net_ReadNetFromCaffe(cprototxt, cmodel))}
|
|
}
|
|
|
|
// BlobFromImage creates 4-dimensional blob from image. Optionally resizes and crops
|
|
// image from center, subtract mean values, scales values by scalefactor,
|
|
// swap Blue and Red channels.
|
|
//
|
|
// For further details, please see:
|
|
// https://docs.opencv.org/trunk/d6/d0f/group__dnn.html#ga152367f253c81b53fe6862b299f5c5cd
|
|
//
|
|
func BlobFromImage(img Mat, scaleFactor float64, size image.Point, mean Scalar,
|
|
swapRB bool, crop bool) Mat {
|
|
|
|
sz := C.struct_Size{
|
|
height: C.int(size.X),
|
|
width: C.int(size.Y),
|
|
}
|
|
|
|
sMean := C.struct_Scalar{
|
|
val1: C.double(mean.Val1),
|
|
val2: C.double(mean.Val2),
|
|
val3: C.double(mean.Val3),
|
|
val4: C.double(mean.Val4),
|
|
}
|
|
|
|
return Mat{p: C.Net_BlobFromImage(img.p, C.double(scaleFactor), sz, sMean, C.bool(swapRB), C.bool(crop))}
|
|
}
|