This commit is contained in:
pikastech 2022-07-15 14:56:10 +08:00 committed by 李昂
parent 02f824ab1b
commit 000ee776b3
3 changed files with 81 additions and 64 deletions

View File

@ -222,27 +222,27 @@ void PikaCV_Image_write(PikaObj* self, char* path) {
__platform_fclose(fp);
}
#define MAX(a,b) ((a) > (b) ? (a) : (b))
#define MIN(a,b) ((a) < (b) ? (a) : (b))
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define MIN(a, b) ((a) < (b) ? (a) : (b))
void PikaCV_Image_add(PikaObj *self, PikaObj* image){
void PikaCV_Image_add(PikaObj* self, PikaObj* image) {
PikaCV_Image* src = obj_getStruct(self, "image");
PikaCV_Image* img = obj_getStruct(image, "image");
if (NULL == src || NULL == img) {
pika_assert(0);
return;
}
if (img->format != src->format ) {
if (img->format != src->format) {
obj_setErrorCode(self, PIKA_RES_ERR_OPERATION_FAILED);
__platform_printf("unsupported image format\n");
return;
}
if (img->size != src->size ) {
if (img->size != src->size) {
obj_setErrorCode(self, PIKA_RES_ERR_OPERATION_FAILED);
__platform_printf("illegal image size\n");
return;
}
uint8_t* src_data = _image_getData(self);
uint8_t* img_data = _image_getData(image);
@ -250,40 +250,43 @@ void PikaCV_Image_add(PikaObj *self, PikaObj* image){
uint8_t result;
/* add two images */
for (i = 0; i < (src->size)/3; i++) {
result=src_data[i * 3] + img_data[i * 3];
src_data[i * 3] = ((result<MAX(src_data[i * 3],img_data[i * 3]))?255:result);
result=src_data[i * 3 + 1] + img_data[i * 3 + 1];
src_data[i * 3 + 1] = ((result<MAX(src_data[i * 3 + 1],img_data[i * 3 + 1]))?255:result);
for (i = 0; i < (src->size) / 3; i++) {
result = src_data[i * 3] + img_data[i * 3];
src_data[i * 3] =
((result < MAX(src_data[i * 3], img_data[i * 3])) ? 255 : result);
result=src_data[i * 3 + 2] + img_data[i * 3 + 2];
src_data[i * 3 + 2] = ((result<MAX(src_data[i * 3 + 2],img_data[i * 3 + 2]))?255:result);
result = src_data[i * 3 + 1] + img_data[i * 3 + 1];
src_data[i * 3 + 1] =
((result < MAX(src_data[i * 3 + 1], img_data[i * 3 + 1])) ? 255
: result);
result = src_data[i * 3 + 2] + img_data[i * 3 + 2];
src_data[i * 3 + 2] =
((result < MAX(src_data[i * 3 + 2], img_data[i * 3 + 2])) ? 255
: result);
}
obj_setBytes(self, "_data", src_data, src->size);
}
void PikaCV_Image_minus(PikaObj *self, PikaObj* image){
void PikaCV_Image_minus(PikaObj* self, PikaObj* image) {
PikaCV_Image* src = obj_getStruct(self, "image");
PikaCV_Image* img = obj_getStruct(image, "image");
if (NULL == src || NULL == img) {
pika_assert(0);
return;
}
if (img->format != src->format ) {
if (img->format != src->format) {
obj_setErrorCode(self, PIKA_RES_ERR_OPERATION_FAILED);
__platform_printf("unsupported image format\n");
return;
}
if (img->size != src->size ) {
if (img->size != src->size) {
obj_setErrorCode(self, PIKA_RES_ERR_OPERATION_FAILED);
__platform_printf("illegal image size\n");
return;
}
uint8_t* src_data = _image_getData(self);
uint8_t* img_data = _image_getData(image);
@ -291,93 +294,97 @@ void PikaCV_Image_minus(PikaObj *self, PikaObj* image){
uint8_t result;
/* minus two images */
for (i = 0; i < (src->size)/3; i++) {
result=src_data[i * 3] - img_data[i * 3];
src_data[i * 3] = ((result<MIN(src_data[i * 3],img_data[i * 3]))?0:result);
result=src_data[i * 3 + 1] - img_data[i * 3 + 1];
src_data[i * 3 + 1] = ((result>MIN(src_data[i * 3 + 1],img_data[i * 3 + 1]))?0:result);
for (i = 0; i < (src->size) / 3; i++) {
result = src_data[i * 3] - img_data[i * 3];
src_data[i * 3] =
((result < MIN(src_data[i * 3], img_data[i * 3])) ? 0 : result);
result=src_data[i * 3 + 2] - img_data[i * 3 + 2];
src_data[i * 3 + 2] = ((result<MIN(src_data[i * 3 + 2],img_data[i * 3 + 2]))?0:result);
result = src_data[i * 3 + 1] - img_data[i * 3 + 1];
src_data[i * 3 + 1] =
((result > MIN(src_data[i * 3 + 1], img_data[i * 3 + 1])) ? 0
: result);
result = src_data[i * 3 + 2] - img_data[i * 3 + 2];
src_data[i * 3 + 2] =
((result < MIN(src_data[i * 3 + 2], img_data[i * 3 + 2])) ? 0
: result);
}
obj_setBytes(self, "_data", src_data, (src->size));
obj_setBytes(self, "_data", src_data, (src->size));
}
void PikaCV_Image_merge(PikaObj *self, PikaObj* B, PikaObj* G, PikaObj* R){
void PikaCV_Image_merge(PikaObj* self, PikaObj* B, PikaObj* G, PikaObj* R) {
PikaCV_Image* src = obj_getStruct(self, "image");
PikaCV_Image* Channel_B = obj_getStruct(B, "image");
PikaCV_Image* Channel_G = obj_getStruct(G, "image");
PikaCV_Image* Channel_R = obj_getStruct(R, "image");
if (NULL == src || NULL == Channel_B || NULL == Channel_G || NULL == Channel_R) {
if (NULL == src || NULL == Channel_B || NULL == Channel_G ||
NULL == Channel_R) {
pika_assert(0);
return;
}
if (PikaCV_ImageFormat_Type_RGB888 != src->format ) {
if (PikaCV_ImageFormat_Type_RGB888 != src->format) {
obj_setErrorCode(self, PIKA_RES_ERR_OPERATION_FAILED);
__platform_printf("unsupported image format\n");
return;
}
if (PikaCV_ImageFormat_Type_GRAY != Channel_B->format ||
PikaCV_ImageFormat_Type_GRAY != Channel_G->format ||
if (PikaCV_ImageFormat_Type_GRAY != Channel_B->format ||
PikaCV_ImageFormat_Type_GRAY != Channel_G->format ||
PikaCV_ImageFormat_Type_GRAY != Channel_R->format) {
obj_setErrorCode(self, PIKA_RES_ERR_OPERATION_FAILED);
__platform_printf("unsupported image format\n");
return;
}
if (Channel_B->size != Channel_G->size ||
}
if (Channel_B->size != Channel_G->size ||
Channel_B->size != Channel_R->size) {
obj_setErrorCode(self, PIKA_RES_ERR_OPERATION_FAILED);
__platform_printf("illegal image size\n");
return;
}
uint8_t* src_data = _image_getData(self);
uint8_t* B_data = _image_getData(B);
uint8_t* G_data = _image_getData(G);
uint8_t* R_data = _image_getData(R);
src->size = Channel_B -> size * 3 ;
src->height = Channel_B -> height ;
src->width = Channel_B -> width ;
src->size = Channel_B->size * 3;
src->height = Channel_B->height;
src->width = Channel_B->width;
for (int i = 0; i < src->size; i++) {
src_data[i * 3] = R_data[i];
src_data[i * 3 + 1] = G_data[i];
src_data[i * 3 + 2] = B_data[i];
}
obj_setBytes(self, "_data", src_data, (src->size));
obj_setBytes(self, "_data", src_data, (src->size));
}
PikaObj* PikaCV_Image_split(PikaObj *self){
PikaObj* PikaCV_Image_split(PikaObj* self) {
PikaCV_Image* src = obj_getStruct(self, "image");
if (NULL == src) {
pika_assert(0);
return ;
return NULL;
}
if (PikaCV_ImageFormat_Type_RGB888 != src->format ) {
if (PikaCV_ImageFormat_Type_RGB888 != src->format) {
obj_setErrorCode(self, PIKA_RES_ERR_OPERATION_FAILED);
__platform_printf("unsupported image format\n");
return;
return NULL;
}
uint8_t* src_data = _image_getData(self);
Arg* arg_data_B = arg_setBytes(NULL, "", NULL, (src->size)/3);
Arg* arg_data_G = arg_setBytes(NULL, "", NULL, (src->size)/3);
Arg* arg_data_R = arg_setBytes(NULL, "", NULL, (src->size)/3);
Arg* arg_data_B = arg_setBytes(NULL, "", NULL, (src->size) / 3);
Arg* arg_data_G = arg_setBytes(NULL, "", NULL, (src->size) / 3);
Arg* arg_data_R = arg_setBytes(NULL, "", NULL, (src->size) / 3);
uint8_t* data_B = arg_getBytes(arg_data_B);
uint8_t* data_G = arg_getBytes(arg_data_G);
uint8_t* data_R = arg_getBytes(arg_data_R);
uint8_t* RGB[3] ={ data_R , data_G , data_B };
uint8_t* RGB[3] = {data_R, data_G, data_B};
for(int i= 0 ; i < (src->size)/3 ; i++){
for (int i = 0; i < (src->size) / 3; i++) {
RGB[0][i] = src_data[i * 3];
RGB[1][i] = src_data[i * 3 + 1];
RGB[2][i] = src_data[i * 3 + 2];
@ -386,8 +393,11 @@ PikaObj* PikaCV_Image_split(PikaObj *self){
PikaObj* list = newNormalObj(New_PikaStdData_List);
PikaStdData_List___init__(list);
for(int i= 0 ; i < 3 ; i++){
Arg* token_arg = arg_setBytes(NULL, "_data", RGB[i],src->size);
for (int i = 0; i < 3; i++) {
PikaObj* img = newNormalObj(New_PikaCV_Image);
PikaCV_Image___init__(img);
PikaCV_Image_loadGray(img, RGB[i], src->width, src->height);
Arg* token_arg = arg_setPtr(NULL, "", ARG_TYPE_OBJECT, img);
/* 添加到 list 对象 */
PikaStdData_List_append(list, token_arg);
/* 销毁 arg */
@ -398,5 +408,5 @@ PikaObj* PikaCV_Image_split(PikaObj *self){
arg_deinit(arg_data_G);
arg_deinit(arg_data_R);
return list;
return list;
}

0
port/linux/test/out/path Normal file
View File

View File

@ -9,10 +9,17 @@ R = Channel[0]
G = Channel[1]
B = Channel[2]
img1 = cv.Image()
cv.Converter.toRGB888(img1)
img1.merge(R,G,B)
cv.Converter.toBMP(img1)
img1.write("test/assets/merge.bmp")
cv.Converter.toBMP(R)
cv.Converter.toBMP(G)
cv.Converter.toBMP(B)
R.write("test/out/R.bmp")
G.write("test/out/G.bmp")
B.write("test/out/B.bmp")
print("Merge done")
# img1 = cv.Image()
# cv.Converter.toRGB888(img1)
# img1.merge(R,G,B)
# cv.Converter.toBMP(img1)
# img1.write("test/assets/merge.bmp")
# print("Merge done")