mirror of
https://github.com/hybridgroup/gocv
synced 2025-08-25 08:41:04 +08:00
Move CascadeClassifier into proper objdetect group
Signed-off-by: deadprogram <ron@hybridgroup.com>
This commit is contained in:
@@ -9,6 +9,7 @@ typedef struct String {
|
|||||||
const char* str;
|
const char* str;
|
||||||
int length;
|
int length;
|
||||||
} String;
|
} String;
|
||||||
|
|
||||||
typedef struct ByteArray{
|
typedef struct ByteArray{
|
||||||
char *data;
|
char *data;
|
||||||
int length;
|
int length;
|
||||||
|
|||||||
27
objdetect.cpp
Normal file
27
objdetect.cpp
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
#include "objdetect.h"
|
||||||
|
|
||||||
|
// CascadeClassifier
|
||||||
|
CascadeClassifier CascadeClassifier_New() {
|
||||||
|
return new cv::CascadeClassifier();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CascadeClassifier_Delete(CascadeClassifier cs) {
|
||||||
|
delete cs;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CascadeClassifier_Load(CascadeClassifier cs, const char* name) {
|
||||||
|
return cs->load(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Rects CascadeClassifier_DetectMultiScale(CascadeClassifier cs, MatVec3b img) {
|
||||||
|
std::vector<cv::Rect> faces;
|
||||||
|
cs->detectMultiScale(*img, faces); // TODO control default parameter
|
||||||
|
Rect* rects = new Rect[faces.size()];
|
||||||
|
for (size_t i = 0; i < faces.size(); ++i) {
|
||||||
|
Rect r = {faces[i].x, faces[i].y, faces[i].width, faces[i].height};
|
||||||
|
rects[i] = r;
|
||||||
|
}
|
||||||
|
Rects ret = {rects, (int)faces.size()};
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
63
objdetect.go
Normal file
63
objdetect.go
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
package opencv3
|
||||||
|
|
||||||
|
/*
|
||||||
|
#cgo linux pkg-config: opencv
|
||||||
|
#cgo darwin pkg-config: opencv
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "objdetect.h"
|
||||||
|
*/
|
||||||
|
import "C"
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
// CascadeClassifier is a bind of `cv::CascadeClassifier`
|
||||||
|
type CascadeClassifier struct {
|
||||||
|
p C.CascadeClassifier
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewCascadeClassifier returns a new CascadeClassifier.
|
||||||
|
func NewCascadeClassifier() CascadeClassifier {
|
||||||
|
return CascadeClassifier{p: C.CascadeClassifier_New()}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete CascadeClassifier's pointer.
|
||||||
|
func (c *CascadeClassifier) Delete() {
|
||||||
|
C.CascadeClassifier_Delete(c.p)
|
||||||
|
c.p = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load cascade configuration file to classifier.
|
||||||
|
func (c *CascadeClassifier) Load(name string) bool {
|
||||||
|
cName := C.CString(name)
|
||||||
|
defer C.free(unsafe.Pointer(cName))
|
||||||
|
return C.CascadeClassifier_Load(c.p, cName) != 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// DetectMultiScale detects something which is decided by loaded file. Returns
|
||||||
|
// multi results addressed with rectangle.
|
||||||
|
func (c *CascadeClassifier) DetectMultiScale(img MatVec3b) []Rect {
|
||||||
|
ret := C.CascadeClassifier_DetectMultiScale(c.p, img.p)
|
||||||
|
defer C.Rects_Delete(ret)
|
||||||
|
|
||||||
|
cArray := ret.rects
|
||||||
|
length := int(ret.length)
|
||||||
|
hdr := reflect.SliceHeader{
|
||||||
|
Data: uintptr(unsafe.Pointer(cArray)),
|
||||||
|
Len: length,
|
||||||
|
Cap: length,
|
||||||
|
}
|
||||||
|
goSlice := *(*[]C.Rect)(unsafe.Pointer(&hdr))
|
||||||
|
|
||||||
|
rects := make([]Rect, length)
|
||||||
|
for i, r := range goSlice {
|
||||||
|
rects[i] = Rect{
|
||||||
|
X: int(r.x),
|
||||||
|
Y: int(r.y),
|
||||||
|
Width: int(r.width),
|
||||||
|
Height: int(r.height),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return rects
|
||||||
|
}
|
||||||
27
objdetect.h
Normal file
27
objdetect.h
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
#ifndef _OPENCV3_OBJDETECT_H_
|
||||||
|
#define _OPENCV3_OBJDETECT_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
#include <opencv2/opencv.hpp>
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "opencv3.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
typedef cv::CascadeClassifier* CascadeClassifier;
|
||||||
|
#else
|
||||||
|
typedef void* CascadeClassifier;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// CascadeClassifier
|
||||||
|
CascadeClassifier CascadeClassifier_New();
|
||||||
|
void CascadeClassifier_Delete(CascadeClassifier cs);
|
||||||
|
int CascadeClassifier_Load(CascadeClassifier cs, const char* name);
|
||||||
|
struct Rects CascadeClassifier_DetectMultiScale(CascadeClassifier cs, MatVec3b img);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif //_OPENCV3_OBJDETECT_H_
|
||||||
25
opencv3.cpp
25
opencv3.cpp
@@ -70,31 +70,6 @@ MatVec4b RawData_ToMatVec4b(struct RawData r) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
CascadeClassifier CascadeClassifier_New() {
|
|
||||||
return new cv::CascadeClassifier();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CascadeClassifier_Delete(CascadeClassifier cs) {
|
|
||||||
delete cs;
|
|
||||||
}
|
|
||||||
|
|
||||||
int CascadeClassifier_Load(CascadeClassifier cs, const char* name) {
|
|
||||||
return cs->load(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct Rects CascadeClassifier_DetectMultiScale(CascadeClassifier cs, MatVec3b img) {
|
|
||||||
std::vector<cv::Rect> faces;
|
|
||||||
cs->detectMultiScale(*img, faces); // TODO control default parameter
|
|
||||||
Rect* rects = new Rect[faces.size()];
|
|
||||||
for (size_t i = 0; i < faces.size(); ++i) {
|
|
||||||
Rect r = {faces[i].x, faces[i].y, faces[i].width, faces[i].height};
|
|
||||||
rects[i] = r;
|
|
||||||
}
|
|
||||||
Rects ret = {rects, (int)faces.size()};
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Rects_Delete(struct Rects rs) {
|
void Rects_Delete(struct Rects rs) {
|
||||||
delete rs.rects;
|
delete rs.rects;
|
||||||
}
|
}
|
||||||
|
|||||||
51
opencv3.go
51
opencv3.go
@@ -8,7 +8,6 @@ package opencv3
|
|||||||
*/
|
*/
|
||||||
import "C"
|
import "C"
|
||||||
import (
|
import (
|
||||||
"reflect"
|
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -113,29 +112,6 @@ func ToMatVec4b(width int, height int, data []byte) MatVec4b {
|
|||||||
return MatVec4b{p: C.RawData_ToMatVec4b(cr)}
|
return MatVec4b{p: C.RawData_ToMatVec4b(cr)}
|
||||||
}
|
}
|
||||||
|
|
||||||
// CascadeClassifier is a bind of `cv::CascadeClassifier`
|
|
||||||
type CascadeClassifier struct {
|
|
||||||
p C.CascadeClassifier
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewCascadeClassifier returns a new CascadeClassifier.
|
|
||||||
func NewCascadeClassifier() CascadeClassifier {
|
|
||||||
return CascadeClassifier{p: C.CascadeClassifier_New()}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delete CascadeClassifier's pointer.
|
|
||||||
func (c *CascadeClassifier) Delete() {
|
|
||||||
C.CascadeClassifier_Delete(c.p)
|
|
||||||
c.p = nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load cascade configuration file to classifier.
|
|
||||||
func (c *CascadeClassifier) Load(name string) bool {
|
|
||||||
cName := C.CString(name)
|
|
||||||
defer C.free(unsafe.Pointer(cName))
|
|
||||||
return C.CascadeClassifier_Load(c.p, cName) != 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// Rect represents rectangle. X and Y is a start point of Width and Height.
|
// Rect represents rectangle. X and Y is a start point of Width and Height.
|
||||||
type Rect struct {
|
type Rect struct {
|
||||||
X int
|
X int
|
||||||
@@ -144,33 +120,6 @@ type Rect struct {
|
|||||||
Height int
|
Height int
|
||||||
}
|
}
|
||||||
|
|
||||||
// DetectMultiScale detects something which is decided by loaded file. Returns
|
|
||||||
// multi results addressed with rectangle.
|
|
||||||
func (c *CascadeClassifier) DetectMultiScale(img MatVec3b) []Rect {
|
|
||||||
ret := C.CascadeClassifier_DetectMultiScale(c.p, img.p)
|
|
||||||
defer C.Rects_Delete(ret)
|
|
||||||
|
|
||||||
cArray := ret.rects
|
|
||||||
length := int(ret.length)
|
|
||||||
hdr := reflect.SliceHeader{
|
|
||||||
Data: uintptr(unsafe.Pointer(cArray)),
|
|
||||||
Len: length,
|
|
||||||
Cap: length,
|
|
||||||
}
|
|
||||||
goSlice := *(*[]C.Rect)(unsafe.Pointer(&hdr))
|
|
||||||
|
|
||||||
rects := make([]Rect, length)
|
|
||||||
for i, r := range goSlice {
|
|
||||||
rects[i] = Rect{
|
|
||||||
X: int(r.x),
|
|
||||||
Y: int(r.y),
|
|
||||||
Width: int(r.width),
|
|
||||||
Height: int(r.height),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return rects
|
|
||||||
}
|
|
||||||
|
|
||||||
// DrawRectsToImage draws rectangle information to target image.
|
// DrawRectsToImage draws rectangle information to target image.
|
||||||
func DrawRectsToImage(img MatVec3b, rects []Rect) {
|
func DrawRectsToImage(img MatVec3b, rects []Rect) {
|
||||||
cRectArray := make([]C.struct_Rect, len(rects))
|
cRectArray := make([]C.struct_Rect, len(rects))
|
||||||
|
|||||||
12
opencv3.h
12
opencv3.h
@@ -29,13 +29,14 @@ typedef struct Rects {
|
|||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
typedef cv::Mat_<cv::Vec3b>* MatVec3b;
|
typedef cv::Mat_<cv::Vec3b>* MatVec3b;
|
||||||
typedef cv::Mat_<cv::Vec4b>* MatVec4b;
|
typedef cv::Mat_<cv::Vec4b>* MatVec4b;
|
||||||
typedef cv::CascadeClassifier* CascadeClassifier;
|
|
||||||
#else
|
#else
|
||||||
typedef void* MatVec3b;
|
typedef void* MatVec3b;
|
||||||
typedef void* MatVec4b;
|
typedef void* MatVec4b;
|
||||||
typedef void* CascadeClassifier;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void Rects_Delete(struct Rects rs);
|
||||||
|
void DrawRectsToImage(MatVec3b img, struct Rects rects);
|
||||||
|
|
||||||
MatVec3b MatVec3b_New();
|
MatVec3b MatVec3b_New();
|
||||||
struct ByteArray MatVec3b_ToJpegData(MatVec3b m, int quality);
|
struct ByteArray MatVec3b_ToJpegData(MatVec3b m, int quality);
|
||||||
void MatVec3b_Delete(MatVec3b m);
|
void MatVec3b_Delete(MatVec3b m);
|
||||||
@@ -47,13 +48,6 @@ MatVec3b RawData_ToMatVec3b(struct RawData r);
|
|||||||
void MatVec4b_Delete(MatVec4b m);
|
void MatVec4b_Delete(MatVec4b m);
|
||||||
struct RawData MatVec4b_ToRawData(MatVec4b m);
|
struct RawData MatVec4b_ToRawData(MatVec4b m);
|
||||||
MatVec4b RawData_ToMatVec4b(struct RawData r);
|
MatVec4b RawData_ToMatVec4b(struct RawData r);
|
||||||
|
|
||||||
CascadeClassifier CascadeClassifier_New();
|
|
||||||
void CascadeClassifier_Delete(CascadeClassifier cs);
|
|
||||||
int CascadeClassifier_Load(CascadeClassifier cs, const char* name);
|
|
||||||
struct Rects CascadeClassifier_DetectMultiScale(CascadeClassifier cs, MatVec3b img);
|
|
||||||
void Rects_Delete(struct Rects rs);
|
|
||||||
void DrawRectsToImage(MatVec3b img, struct Rects rects);
|
|
||||||
MatVec4b LoadAlphaImg(const char* name);
|
MatVec4b LoadAlphaImg(const char* name);
|
||||||
void MountAlphaImage(MatVec4b img, MatVec3b back, struct Rects rects);
|
void MountAlphaImage(MatVec4b img, MatVec3b back, struct Rects rects);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user