在用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;
			}
		}
	}

 

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐