Move CascadeClassifier into proper objdetect group

Signed-off-by: deadprogram <ron@hybridgroup.com>
This commit is contained in:
deadprogram
2017-09-19 11:08:21 +02:00
parent 6ad065bb3d
commit aab4fd64b8
7 changed files with 121 additions and 85 deletions

View File

@@ -9,6 +9,7 @@ typedef struct String {
const char* str;
int length;
} String;
typedef struct ByteArray{
char *data;
int length;

27
objdetect.cpp Normal file
View 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
View 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
View 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_

View File

@@ -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) {
delete rs.rects;
}

View File

@@ -8,7 +8,6 @@ package opencv3
*/
import "C"
import (
"reflect"
"unsafe"
)
@@ -113,29 +112,6 @@ func ToMatVec4b(width int, height int, data []byte) MatVec4b {
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.
type Rect struct {
X int
@@ -144,33 +120,6 @@ type Rect struct {
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.
func DrawRectsToImage(img MatVec3b, rects []Rect) {
cRectArray := make([]C.struct_Rect, len(rects))

View File

@@ -29,13 +29,14 @@ typedef struct Rects {
#ifdef __cplusplus
typedef cv::Mat_<cv::Vec3b>* MatVec3b;
typedef cv::Mat_<cv::Vec4b>* MatVec4b;
typedef cv::CascadeClassifier* CascadeClassifier;
#else
typedef void* MatVec3b;
typedef void* MatVec4b;
typedef void* CascadeClassifier;
#endif
void Rects_Delete(struct Rects rs);
void DrawRectsToImage(MatVec3b img, struct Rects rects);
MatVec3b MatVec3b_New();
struct ByteArray MatVec3b_ToJpegData(MatVec3b m, int quality);
void MatVec3b_Delete(MatVec3b m);
@@ -47,13 +48,6 @@ MatVec3b RawData_ToMatVec3b(struct RawData r);
void MatVec4b_Delete(MatVec4b m);
struct RawData MatVec4b_ToRawData(MatVec4b m);
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);
void MountAlphaImage(MatVec4b img, MatVec3b back, struct Rects rects);