CV\Scalar and CV\Size Class

Esse commit está contido em:
hihozhou
2017-06-23 16:52:38 +08:00
commit 7cfe9f242f
5 arquivos alterados com 248 adições e 21 exclusões
+13 -1
Ver Arquivo
@@ -86,6 +86,18 @@ $im = imread('Obama.png',IMREAD_GRAYSCALE);
- Mat(class)
- __construct
- print
- Point(class)
- __construct
- print
- Scalar(class)
- __construct
- print
- Size(class)
- __construct
- print
- Scalar(class)
- __construct
- print
- imread(function)
- imwrite(function)
- namedWindow(function)
@@ -95,6 +107,6 @@ $im = imread('Obama.png',IMREAD_GRAYSCALE);
## 感谢
感谢[韩天峰](http://rango.swoole.com/)老大的指导,
感谢[韩天峰](https://github.com/matyhtf)老大的指导,
感谢[盘古大叔](https://github.com/pangudashu)的[php7-internal](https://github.com/pangudashu/php7-internal)项目以及平常的指导,
感谢`木桶技术升级交流群``黑夜路人技术群`、以及`PHP内核交流`的群友对技术的帮助。
+14 -4
Ver Arquivo
@@ -4,6 +4,7 @@
#include "../../../php_opencv.h"
#include "opencv_mat.h"
#include "opencv_type.h"
zend_object_handlers opencv_mat_object_handlers;
@@ -42,13 +43,22 @@ void mat_free_handler(zend_object *object)
PHP_METHOD(opencv_mat, __construct)
{
long rows, cols, type;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "lll", &rows, &cols, &type) == FAILURE) {
zval *scalar_zval = NULL;
Scalar scalar;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "lll|O", &rows, &cols, &type, &scalar_zval,opencv_scalar_ce) == FAILURE) {
RETURN_NULL();
}
opencv_mat_object *obj = Z_PHP_MAT_OBJ_P(getThis());
if(scalar_zval!=NULL){
opencv_scalar_object *scalar_object = Z_PHP_SCALAR_OBJ_P(scalar_zval);
scalar = *(scalar_object->scalar);
}else{
scalar=Scalar(0);
}
Mat M((int)rows, (int)cols, (int)type);
obj->mat = new Mat(M);
// obj->mat = new Mat((int)rows, (int)cols, (int)type, Scalar(0));
// obj->mat = new Mat(M);
obj->mat = new Mat((int)rows, (int)cols, (int)type, scalar);
//obj->mat = new Mat((int)rows, (int)cols, (int)type); //TODO Why Mat array not correct
zend_update_property_long(opencv_mat_ce, getThis(), "rows", sizeof("rows")-1, rows);
zend_update_property_long(opencv_mat_ce, getThis(), "cols", sizeof("cols")-1, cols);
@@ -63,7 +73,7 @@ PHP_METHOD(opencv_mat, __construct)
PHP_METHOD(opencv_mat, print)
{
opencv_mat_object *obj = Z_PHP_MAT_OBJ_P(getThis());
std::cout <<*(obj->mat)<< std::endl;
std::cout << format(*(obj->mat),Formatter::FMT_PYTHON) << std::endl;
RETURN_NULL();
}
+210 -7
Ver Arquivo
@@ -19,7 +19,7 @@ zend_class_entry *opencv_rect_ce;
zend_object_handlers opencv_point_object_handlers;
/**
* Mat __construct
* Point __construct
* @param execute_data
* @param return_value
*/
@@ -38,7 +38,7 @@ PHP_METHOD(opencv_point, __construct)
}
/**
* print Mat data
* print Point data
* @param execute_data
* @param return_value
*/
@@ -56,7 +56,7 @@ PHP_METHOD(opencv_point, print)
*/
const zend_function_entry opencv_point_methods[] = {
PHP_ME(opencv_point, __construct, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR)
// PHP_ME(opencv_point, print, NULL, ZEND_ACC_PUBLIC) //todo why Point print method can effect Mat print method
PHP_ME(opencv_point, print, NULL, ZEND_ACC_PUBLIC) //todo why Point print method can effect Mat print method
PHP_FE_END
};
/* }}} */
@@ -97,7 +97,7 @@ void opencv_point_write_property(zval *object, zval *member, zval *value, void *
}
/**
* Type Init
* Point Init
*/
void opencv_point_init(int module_number){
zend_class_entry ce;
@@ -109,9 +109,6 @@ void opencv_point_init(int module_number){
zend_get_std_object_handlers(), sizeof(zend_object_handlers));
opencv_point_object_handlers.clone_obj = NULL;
opencv_point_object_handlers.write_property = opencv_point_write_property;
// zend_declare_property_null(opencv_point_ce,"type",sizeof("type") - 1,ZEND_ACC_PRIVATE);//private Mat->type
// mat_object_handlers.free_obj = mat_free_handler;
}
@@ -124,10 +121,214 @@ void opencv_point_init(int module_number){
* -------------------------------------------------------------------------------------
*/
zend_object_handlers opencv_scalar_object_handlers;
zend_object* opencv_scalar_create_handler(zend_class_entry *type)
{
int size = sizeof(opencv_scalar_object);
opencv_scalar_object *obj = (opencv_scalar_object *)ecalloc(1,size);
memset(obj, 0, sizeof(opencv_scalar_object));
zend_object_std_init(&obj->std, type);
object_properties_init(&obj->std, type);
obj->std.ce = type;
obj->std.handlers = &opencv_scalar_object_handlers;
return &obj->std;
}
/**
* Scalar __construct
* @param execute_data
* @param return_value
*/
PHP_METHOD(opencv_scalar, __construct)
{
long blue=0, green = 0, red = 0;//value:0~255
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|lll", &blue, &green ,&red) == FAILURE) {
RETURN_NULL();
}
opencv_scalar_object *obj = Z_PHP_SCALAR_OBJ_P(getThis());
Scalar scalar = Scalar((int)blue, (int)green, (int)red);
obj->scalar = new Scalar(scalar);
zend_update_property_long(opencv_scalar_ce, getThis(), "blue", sizeof("blue")-1, obj->scalar->val[0]);
zend_update_property_long(opencv_scalar_ce, getThis(), "green", sizeof("green")-1, obj->scalar->val[1]);
zend_update_property_long(opencv_scalar_ce, getThis(), "red", sizeof("red")-1, obj->scalar->val[2]);
}
/**
* print Scalar data
* @param execute_data
* @param return_value
*/
PHP_METHOD(opencv_scalar, print)
{
opencv_scalar_object *obj = Z_PHP_SCALAR_OBJ_P(getThis());
std::cout <<*(obj->scalar)<< std::endl;
RETURN_NULL();
}
/**
* opencv_point_methods[]
*/
const zend_function_entry opencv_scalar_methods[] = {
PHP_ME(opencv_scalar, __construct, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR)
PHP_ME(opencv_scalar, print, NULL, ZEND_ACC_PUBLIC)
PHP_FE_END
};
/* }}} */
/**
* Point Class write_property
* @param object
* @param member
* @param value
* @param cache_slot
*/
void opencv_scalar_write_property(zval *object, zval *member, zval *value, void **cache_slot){
zend_string *str = zval_get_string(member);
char *memberName=ZSTR_VAL(str);
opencv_scalar_object *obj = Z_PHP_SCALAR_OBJ_P(object);
if(strcmp(memberName, "blue") == 0 && obj->scalar->val[0]!=(int)zval_get_long(value)){
obj->scalar->val[0]=(int)zval_get_long(value);
}else if(strcmp(memberName, "green") == 0 && obj->scalar->val[1]!=(int)zval_get_long(value)){
obj->scalar->val[1]=(int)zval_get_long(value);
}else if(strcmp(memberName, "red") == 0 && obj->scalar->val[2]!=(int)zval_get_long(value)){
obj->scalar->val[2]=(int)zval_get_long(value);
}
zend_string_release(str);//free zend_string not memberName(zend_string->val)
std_object_handlers.write_property(object,member,value,cache_slot);
}
/**
* Scalar Init
*/
void opencv_scalar_init(int module_number){
zend_class_entry ce;
INIT_NS_CLASS_ENTRY(ce,OPENCV_NS, "Scalar", opencv_scalar_methods);
opencv_scalar_ce = zend_register_internal_class(&ce);
opencv_scalar_ce->create_object = opencv_scalar_create_handler;
memcpy(&opencv_scalar_object_handlers,
zend_get_std_object_handlers(), sizeof(zend_object_handlers));
opencv_scalar_object_handlers.clone_obj = NULL;
opencv_scalar_object_handlers.write_property = opencv_scalar_write_property;
}
//-----------------------------------【CV\Size】---------------------------------------
//
//-------------------------------------------------------------------------------------
zend_object_handlers opencv_size_object_handlers;
zend_object* opencv_size_create_handler(zend_class_entry *type)
{
int size = sizeof(opencv_size_object);
opencv_size_object *obj = (opencv_size_object *)ecalloc(1,size);
memset(obj, 0, sizeof(opencv_size_object));
zend_object_std_init(&obj->std, type);
object_properties_init(&obj->std, type);
obj->std.ce = type;
obj->std.handlers = &opencv_size_object_handlers;
return &obj->std;
}
/**
* Size __construct
* @param execute_data
* @param return_value
*/
PHP_METHOD(opencv_size, __construct)
{
long width=0, height = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|ll", &width, &height) == FAILURE) {
RETURN_NULL();
}
opencv_size_object *obj = Z_PHP_SIZE_OBJ_P(getThis());
Size size = Size((int)width, (int)height);
obj->size = new Size(size);
zend_update_property_long(opencv_scalar_ce, getThis(), "width", sizeof("width")-1, obj->size->width);
zend_update_property_long(opencv_scalar_ce, getThis(), "height", sizeof("height")-1, obj->size->height);
}
/**
* print Scalar data
* @param execute_data
* @param return_value
*/
PHP_METHOD(opencv_size, print)
{
opencv_size_object *obj = Z_PHP_SIZE_OBJ_P(getThis());
std::cout <<*(obj->size)<< std::endl;
RETURN_NULL();
}
/**
* opencv_point_methods[]
*/
const zend_function_entry opencv_size_methods[] = {
PHP_ME(opencv_size, __construct, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR)
PHP_ME(opencv_size, print, NULL, ZEND_ACC_PUBLIC)
PHP_FE_END
};
/* }}} */
/**
* Point Class write_property
* @param object
* @param member
* @param value
* @param cache_slot
*/
void opencv_size_write_property(zval *object, zval *member, zval *value, void **cache_slot){
zend_string *str = zval_get_string(member);
char *memberName=ZSTR_VAL(str);
opencv_size_object *obj = Z_PHP_SIZE_OBJ_P(object);
if(strcmp(memberName, "width") == 0 && obj->size->width!=(int)zval_get_long(value)){
obj->size->width=(int)zval_get_long(value);
}else if(strcmp(memberName, "height") == 0 && obj->size->height!=(int)zval_get_long(value)){
obj->size->height=(int)zval_get_long(value);
}
zend_string_release(str);//free zend_string not memberName(zend_string->val)
std_object_handlers.write_property(object,member,value,cache_slot);
}
/**
* Scalar Init
*/
void opencv_size_init(int module_number){
zend_class_entry ce;
INIT_NS_CLASS_ENTRY(ce,OPENCV_NS, "Size", opencv_size_methods);
opencv_size_ce = zend_register_internal_class(&ce);
opencv_size_ce->create_object = opencv_size_create_handler;
memcpy(&opencv_size_object_handlers,
zend_get_std_object_handlers(), sizeof(zend_object_handlers));
opencv_size_object_handlers.clone_obj = NULL;
opencv_size_object_handlers.write_property = opencv_size_write_property;
}
//-----------------------------------【CV\Rect】---------------------------------------
//
//-------------------------------------------------------------------------------------
@@ -138,4 +339,6 @@ void opencv_point_init(int module_number){
*/
void opencv_type_init(int module_number){
opencv_point_init(module_number);
opencv_scalar_init(module_number);
opencv_size_init(module_number);
}
+10 -8
Ver Arquivo
@@ -5,22 +5,24 @@ Mat __construct
--FILE--
<?php
use CV\Mat;
$mat = new Mat(5,5,1);
use CV\Scalar;
$scalar = new Scalar(255,100,100);
$mat = new Mat(5,5,CV_8UC3,$scalar);
//$mat->rows=10;
var_dump($mat);
$mat->print();
?>
--EXPECT--
object(CV\Mat)#1 (3) {
object(CV\Mat)#2 (3) {
["type":"CV\Mat":private]=>
int(1)
int(16)
["rows"]=>
int(5)
["cols"]=>
int(5)
}
[ 0, 0, 0, 0, 0;
0, 0, 0, 0, 0;
0, 0, 0, 0, 0;
0, 0, 0, 0, 0;
0, 0, 0, 0, 0]
[[[255, 100, 100], [255, 100, 100], [255, 100, 100], [255, 100, 100], [255, 100, 100]],
[[255, 100, 100], [255, 100, 100], [255, 100, 100], [255, 100, 100], [255, 100, 100]],
[[255, 100, 100], [255, 100, 100], [255, 100, 100], [255, 100, 100], [255, 100, 100]],
[[255, 100, 100], [255, 100, 100], [255, 100, 100], [255, 100, 100], [255, 100, 100]],
[[255, 100, 100], [255, 100, 100], [255, 100, 100], [255, 100, 100], [255, 100, 100]]]
+1 -1
Ver Arquivo
@@ -1,5 +1,5 @@
--TEST--
Mat __construct
Exception
--SKIPIF--
<?php if (!extension_loaded("opencv")) print "skip"; ?>
--FILE--