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; | ||||
|   int length; | ||||
| } String; | ||||
|  | ||||
| typedef struct ByteArray{ | ||||
|   char *data; | ||||
|   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) { | ||||
|   delete rs.rects; | ||||
| } | ||||
|   | ||||
							
								
								
									
										51
									
								
								opencv3.go
									
									
									
									
									
								
							
							
						
						
									
										51
									
								
								opencv3.go
									
									
									
									
									
								
							| @@ -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)) | ||||
|   | ||||
							
								
								
									
										12
									
								
								opencv3.h
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								opencv3.h
									
									
									
									
									
								
							| @@ -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); | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 deadprogram
					deadprogram