opencv的Mat转换为darknet的image
在用darknet做算法检测时,需要将opencv的mat转换成darknet的image结构,其实这一块代码在darknet源码里面是包含的,分别在下面这两个函数里面load_data_detection(){src = load_image_mat_cv(filename, flag);image ai = image_data_augmentation(src, w, h, pleft, p
·
在用darknet做算法检测时,需要将opencv的mat转换成darknet的image结构,其实这一块代码在darknet源码里面是包含的,分别在下面这两个函数里面
load_data_detection()
{
src = load_image_mat_cv(filename, flag);
image ai = image_data_augmentation(src, w, h, pleft, ptop, swidth, sheight, flip, jitter, dhue, dsat, dexp);
}
从darknet的源码可以看到,其中load_image_mat_cv这个函数里面主要是把RGB转换成了BGR,然后在下面的iamge_data_augmentation这个函数里面是做了各种处理,最后有一个extern "C" image mat_to_image(cv::Mat mat),所以实际上我们可以先把rgb转换成bgr,然后用mat_to_image里面的代码转成darknet的image格式,代码如下:
cv::Mat cv_image = cv::imread(imagePath, 3);
cv::Mat dst;
cv::cvtColor(cv_image, dst, cv::COLOR_RGB2BGR);
int w = cv_image.cols;
int h = cv_image.rows;
int c = cv_image.channels();
image im = make_image(w, h, c);
unsigned char * imageData = (unsigned char *)dst.data;
int step = dst.step;
for (int y = 0; y < h; ++y) {
for (int k = 0; k < c; ++k) {
for (int x = 0; x < w; ++x) {
im.data[k*w*h + y*w + x] = imageData[y*step + x*c + k] / 255.0f;
}
}
}
更多推荐
所有评论(0)