image load_image_color(char *filename, int w, int h)
{
return load_image(filename, w, h, 3);
}
image load_image(char *filename, int w, int h, int c)
{
#ifdef OPENCV
image out = load_image_cv(filename, c);
#else
image out = load_image_stb(filename, c);
#endif
if((h && w) && (h != out.h || w != out.w)){
//按网络要求调整到(w,h)大小,前提是输入的w,h不要是0
image resized = resize_image(out, w, h);
free_image(out);
out = resized;
}
return out;
}
因为自己的电脑安装了opencv,所以通过opencv提供库函数来加载图像。
image load_image_cv(char *filename, int channels)
{
IplImage* src = 0;
int flag = -1;
if (channels == 0) flag = -1;
else if (channels == 1) flag = 0; //grayscale image
else if (channels == 3) flag = 1; //3-channel color image
else {
fprintf(stderr, "OpenCV can't force load with %d channels\n", channels);
}
//opencv api load image
if( (src = cvLoadImage(filename, flag)) == 0 )
{
fprintf(stderr, "Cannot load image \"%s\"\n", filename);
char buff[256];
sprintf(buff, "echo %s >> bad.list", filename);
system(buff);
return make_image(10,10,3);
//exit(0);
}
//将读取到的IplImage容器中的图片装入image结构中
image out = ipl_to_image(src);
cvReleaseImage(&src);
rgbgr_image(out); //convert BGR to RGB
return out;
}
调用ipl_to_image转换opencv读入的图像。
//convert OpenCV IplImage to image
image ipl_to_image(IplImage* src)
{
int h = src->height;
int w = src->width;
int c = src->nChannels;
image out = make_image(w, h, c); //create empty image container,(w,h,c)
ipl_into_image(src, out); //convert IplImage format to image struct
return out;
}
将IplImage容器中保存的原始图像存入到darknet的image结构中。
void ipl_into_image(IplImage* src, image im)
{
unsigned char *data = (unsigned char *)src->imageData;
int h = src->height;
int w = src->width;
int c = src->nChannels;
//在我本机上调试的结果,此处widthStep为20
int step = src->widthStep; //size of aligned image row in bytes
int i, j, k;
for(i = 0; i < h; ++i){
for(k= 0; k < c; ++k){
for(j = 0; j < w; ++j){
//归一化后存入一维数组
im.data[k*w*h + i*w + j] = data[i*step + j*c + k]/255.;
}
}
}
}
注意存入到一维数组中的图像的顺序。