Files
openvino/samples/c/common/opencv_c_wrapper/opencv_c_wrapper.cpp
Xuejun Zhai 66257530e3 [Coverity Scan] sample issue from CS fix (#12509)
Signed-off-by: xuejun <Xuejun.Zhai@intel.com>

Signed-off-by: xuejun <Xuejun.Zhai@intel.com>
Co-authored-by: River Li <river.li@intel.com>
2022-08-16 11:09:00 +08:00

196 lines
6.0 KiB
C++

// Copyright (C) 2018-2022 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
//
#include "opencv_c_wrapper.h"
extern "C" {
#include "bmp_reader.h"
}
#ifndef USE_OPENCV
int image_read(const char* img_path, c_mat_t* img) {
BitMap bmp;
bmp.data = NULL;
int retCode = readBmpImage(img_path, &bmp);
img->mat_data = bmp.data;
img->mat_data_size = bmp.width * bmp.height * 3;
img->mat_width = bmp.width;
img->mat_height = bmp.height;
img->mat_channels = 3;
img->mat_type = bmp.header.type;
return retCode;
}
int image_resize(const c_mat_t* src_img, c_mat_t* dst_img, const int width, const int height) {
return -1;
}
int image_save(const char* img_path, c_mat_t* img) {
return -1;
}
int image_free(c_mat_t* img) {
delete img->mat_data;
return 0;
}
int image_add_rectangles(c_mat_t* img, rectangle_t rects[], int classes[], int num, int thickness) {
return -1;
}
#else
# include <algorithm>
# include <opencv2/opencv.hpp>
int image_read(const char* img_path, c_mat_t* img) {
if (img_path == nullptr || img == nullptr) {
return -1;
}
cv::Mat mat = cv::imread(img_path);
if (mat.data == NULL) {
return -1;
}
img->mat_channels = mat.channels();
img->mat_width = mat.size().width;
img->mat_height = mat.size().height;
img->mat_type = mat.type();
img->mat_data_size = mat.elemSize() * img->mat_width * img->mat_height;
img->mat_data = (unsigned char*)malloc(sizeof(unsigned char) * img->mat_data_size);
if (img->mat_data == NULL) {
return -1;
}
for (int i = 0; i < img->mat_data_size; ++i) {
img->mat_data[i] = mat.data[i];
}
return 0;
}
int image_resize(const c_mat_t* src_img, c_mat_t* dst_img, const int width, const int height) {
if (src_img == nullptr || dst_img == nullptr) {
return -1;
}
cv::Mat mat_src(cv::Size(src_img->mat_width, src_img->mat_height), src_img->mat_type, src_img->mat_data);
cv::Mat mat_dst;
cv::resize(mat_src, mat_dst, cv::Size(width, height));
if (mat_dst.data) {
dst_img->mat_channels = mat_dst.channels();
dst_img->mat_width = mat_dst.size().width;
dst_img->mat_height = mat_dst.size().height;
dst_img->mat_type = mat_dst.type();
dst_img->mat_data_size = mat_dst.elemSize() * dst_img->mat_width * dst_img->mat_height;
dst_img->mat_data = (unsigned char*)malloc(sizeof(unsigned char) * dst_img->mat_data_size);
if (dst_img->mat_data == NULL) {
return -1;
}
for (int i = 0; i < dst_img->mat_data_size; ++i) {
dst_img->mat_data[i] = mat_dst.data[i];
}
} else {
return -1;
}
return 1;
}
int image_save(const char* img_path, c_mat_t* img) {
cv::Mat mat(cv::Size(img->mat_width, img->mat_height), img->mat_type, img->mat_data);
return cv::imwrite(img_path, mat);
}
int image_free(c_mat_t* img) {
if (img) {
free(img->mat_data);
img->mat_data = NULL;
}
return -1;
}
int image_add_rectangles(c_mat_t* img, rectangle_t rects[], int classes[], int num, int thickness) {
int colors_num = 21;
color_t colors[21] = {// colors to be used for bounding boxes
{128, 64, 128}, {232, 35, 244}, {70, 70, 70}, {156, 102, 102}, {153, 153, 190},
{153, 153, 153}, {30, 170, 250}, {0, 220, 220}, {35, 142, 107}, {152, 251, 152},
{180, 130, 70}, {60, 20, 220}, {0, 0, 255}, {142, 0, 0}, {70, 0, 0},
{100, 60, 0}, {90, 0, 0}, {230, 0, 0}, {32, 11, 119}, {0, 74, 111},
{81, 0, 81}};
for (int i = 0; i < num; i++) {
int x = rects[i].x_min;
int y = rects[i].y_min;
int w = rects[i].rect_width;
int h = rects[i].rect_height;
int cls = classes[i] % colors_num; // color of a bounding box line
if (x < 0)
x = 0;
if (y < 0)
y = 0;
if (w < 0)
w = 0;
if (h < 0)
h = 0;
if (x >= img->mat_width) {
x = img->mat_width - 1;
w = 0;
thickness = 1;
}
if (y >= img->mat_height) {
y = img->mat_height - 1;
h = 0;
thickness = 1;
}
if ((x + w) >= img->mat_width) {
w = img->mat_width - x - 1;
}
if ((y + h) >= img->mat_height) {
h = img->mat_height - y - 1;
}
thickness = std::min(std::min(thickness, w / 2 + 1), h / 2 + 1);
size_t shift_first;
size_t shift_second;
for (int t = 0; t < thickness; t++) {
shift_first = (y + t) * img->mat_width * 3;
shift_second = (y + h - t) * img->mat_width * 3;
for (int ii = x; ii < x + w + 1; ii++) {
img->mat_data[shift_first + ii * 3] = colors[cls].r;
img->mat_data[shift_first + ii * 3 + 1] = colors[cls].g;
img->mat_data[shift_first + ii * 3 + 2] = colors[cls].b;
img->mat_data[shift_second + ii * 3] = colors[cls].r;
img->mat_data[shift_second + ii * 3 + 1] = colors[cls].g;
img->mat_data[shift_second + ii * 3 + 2] = colors[cls].b;
}
}
for (int t = 0; t < thickness; t++) {
shift_first = (x + t) * 3;
shift_second = (x + w - t) * 3;
for (int ii = y; ii < y + h + 1; ii++) {
img->mat_data[shift_first + ii * img->mat_width * 3] = colors[cls].r;
img->mat_data[shift_first + ii * img->mat_width * 3 + 1] = colors[cls].g;
img->mat_data[shift_first + ii * img->mat_width * 3 + 2] = colors[cls].b;
img->mat_data[shift_second + ii * img->mat_width * 3] = colors[cls].r;
img->mat_data[shift_second + ii * img->mat_width * 3 + 1] = colors[cls].g;
img->mat_data[shift_second + ii * img->mat_width * 3 + 2] = colors[cls].b;
}
}
}
return 0;
}
#endif // USE_OPENCV