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
	 deadprogram
					deadprogram