|
|
|
#include "precomp.hpp"
|
|
|
|
#include "_lsvm_resizeimg.h"
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <assert.h>
|
|
|
|
#include <math.h>
|
|
|
|
|
|
|
|
IplImage* resize_opencv(IplImage* img, float scale)
|
|
|
|
{
|
|
|
|
IplImage* imgTmp;
|
|
|
|
|
|
|
|
int W, H, tW, tH;
|
|
|
|
|
|
|
|
W = img->width;
|
|
|
|
H = img->height;
|
|
|
|
|
|
|
|
tW = (int)(((float)W) * scale + 0.5);
|
|
|
|
tH = (int)(((float)H) * scale + 0.5);
|
|
|
|
|
|
|
|
imgTmp = cvCreateImage(cvSize(tW , tH), img->depth, img->nChannels);
|
|
|
|
cvResize(img, imgTmp, CV_INTER_AREA);
|
|
|
|
|
|
|
|
return imgTmp;
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
///*
|
|
|
|
// * Fast image subsampling.
|
|
|
|
// * This is used to construct the feature pyramid.
|
|
|
|
// */
|
|
|
|
//
|
|
|
|
//// struct used for caching interpolation values
|
|
|
|
//typedef struct {
|
|
|
|
// int si, di;
|
|
|
|
// float alpha;
|
|
|
|
//}alphainfo;
|
|
|
|
//
|
|
|
|
//// copy src into dst using pre-computed interpolation values
|
|
|
|
//void alphacopy(float *src, float *dst, alphainfo *ofs, int n) {
|
|
|
|
// int i;
|
|
|
|
// for(i = 0; i < n; i++){
|
|
|
|
// dst[ofs[i].di] += ofs[i].alpha * src[ofs[i].si];
|
|
|
|
// }
|
|
|
|
//}
|
|
|
|
//
|
|
|
|
//int round(float val){
|
|
|
|
// return (int)(val + 0.5);
|
|
|
|
//}
|
|
|
|
//void bzero(float * arr, int cnt){
|
|
|
|
// int i;
|
|
|
|
// for(i = 0; i < cnt; i++){
|
|
|
|
// arr[i] = 0.0f;
|
|
|
|
// }
|
|
|
|
//}
|
|
|
|
//// resize along each column
|
|
|
|
//// result is transposed, so we can apply it twice for a complete resize
|
|
|
|
//void resize1dtran(float *src, int sheight, float *dst, int dheight,
|
|
|
|
// int width, int chan) {
|
|
|
|
// alphainfo *ofs;
|
|
|
|
// float scale = (float)dheight/(float)sheight;
|
|
|
|
// float invscale = (float)sheight/(float)dheight;
|
|
|
|
//
|
|
|
|
// // we cache the interpolation values since they can be
|
|
|
|
// // shared among different columns
|
|
|
|
// int len = (int)ceilf(dheight*invscale) + 2*dheight;
|
|
|
|
// int k = 0;
|
|
|
|
// int dy;
|
|
|
|
// float fsy1;
|
|
|
|
// float fsy2;
|
|
|
|
// int sy1;
|
|
|
|
// int sy2;
|
|
|
|
// int sy;
|
|
|
|
// int c, x;
|
|
|
|
// float *s, *d;
|
|
|
|
//
|
|
|
|
// ofs = (alphainfo *) malloc (sizeof(alphainfo) * len);
|
|
|
|
// for (dy = 0; dy < dheight; dy++) {
|
|
|
|
// fsy1 = dy * invscale;
|
|
|
|
// fsy2 = fsy1 + invscale;
|
|
|
|
// sy1 = (int)ceilf(fsy1);
|
|
|
|
// sy2 = (int)floorf(fsy2);
|
|
|
|
//
|
|
|
|
// if (sy1 - fsy1 > 1e-3) {
|
|
|
|
// assert(k < len);
|
|
|
|
// assert(sy1 - 1 >= 0);
|
|
|
|
// ofs[k].di = dy*width;
|
|
|
|
// ofs[k].si = sy1-1;
|
|
|
|
// ofs[k++].alpha = (sy1 - fsy1) * scale;
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// for (sy = sy1; sy < sy2; sy++) {
|
|
|
|
// assert(k < len);
|
|
|
|
// assert(sy < sheight);
|
|
|
|
// ofs[k].di = dy*width;
|
|
|
|
// ofs[k].si = sy;
|
|
|
|
// ofs[k++].alpha = scale;
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// if (fsy2 - sy2 > 1e-3) {
|
|
|
|
// assert(k < len);
|
|
|
|
// assert(sy2 < sheight);
|
|
|
|
// ofs[k].di = dy*width;
|
|
|
|
// ofs[k].si = sy2;
|
|
|
|
// ofs[k++].alpha = (fsy2 - sy2) * scale;
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// // resize each column of each color channel
|
|
|
|
// bzero(dst, chan*width*dheight);
|
|
|
|
// for (c = 0; c < chan; c++) {
|
|
|
|
// for (x = 0; x < width; x++) {
|
|
|
|
// s = src + c*width*sheight + x*sheight;
|
|
|
|
// d = dst + c*width*dheight + x;
|
|
|
|
// alphacopy(s, d, ofs, k);
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// free(ofs);
|
|
|
|
//}
|
|
|
|
//
|
|
|
|
//IplImage * resize_article_dp(IplImage * img, float scale, const int k){
|
|
|
|
// IplImage * imgTmp;
|
|
|
|
// float W, H;
|
|
|
|
// unsigned char *dataSrc;
|
|
|
|
// float * dataf;
|
|
|
|
// float *src, *dst, *tmp;
|
|
|
|
// int i, j, kk, channels;
|
|
|
|
// int index;
|
|
|
|
// int widthStep;
|
|
|
|
// int tW, tH;
|
|
|
|
//
|
|
|
|
// W = (float)img->width;
|
|
|
|
// H = (float)img->height;
|
|
|
|
// channels = img->nChannels;
|
|
|
|
// widthStep = img->widthStep;
|
|
|
|
//
|
|
|
|
// tW = (int)(((float)W) * scale + 0.5f);
|
|
|
|
// tH = (int)(((float)H) * scale + 0.5f);
|
|
|
|
//
|
|
|
|
// src = (float *)malloc(sizeof(float) * (int)(W * H * 3));
|
|
|
|
//
|
|
|
|
// dataSrc = (unsigned char*)(img->imageData);
|
|
|
|
// index = 0;
|
|
|
|
// for (kk = 0; kk < channels; kk++)
|
|
|
|
// {
|
|
|
|
// for (i = 0; i < W; i++)
|
|
|
|
// {
|
|
|
|
// for (j = 0; j < H; j++)
|
|
|
|
// {
|
|
|
|
// src[index++] = (float)dataSrc[j * widthStep + i * channels + kk];
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// imgTmp = cvCreateImage(cvSize(tW , tH), IPL_DEPTH_32F, channels);
|
|
|
|
//
|
|
|
|
// dst = (float *)malloc(sizeof(float) * (int)(tH * tW) * channels);
|
|
|
|
// tmp = (float *)malloc(sizeof(float) * (int)(tH * W) * channels);
|
|
|
|
//
|
|
|
|
// resize1dtran(src, (int)H, tmp, (int)tH, (int)W , 3);
|
|
|
|
//
|
|
|
|
// resize1dtran(tmp, (int)W, dst, (int)tW, (int)tH, 3);
|
|
|
|
//
|
|
|
|
// index = 0;
|
|
|
|
// //dataf = (float*)imgTmp->imageData;
|
|
|
|
// for (kk = 0; kk < channels; kk++)
|
|
|
|
// {
|
|
|
|
// for (i = 0; i < tW; i++)
|
|
|
|
// {
|
|
|
|
// for (j = 0; j < tH; j++)
|
|
|
|
// {
|
|
|
|
// dataf = (float*)(imgTmp->imageData + j * imgTmp->widthStep);
|
|
|
|
// dataf[ i * channels + kk] = dst[index++];
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// free(src);
|
|
|
|
// free(dst);
|
|
|
|
// free(tmp);
|
|
|
|
// return imgTmp;
|
|
|
|
//}
|
|
|
|
//
|
|
|
|
//IplImage * resize_article_dp1(IplImage * img, float scale, const int k){
|
|
|
|
// IplImage * imgTmp;
|
|
|
|
// float W, H;
|
|
|
|
// float * dataf;
|
|
|
|
// float *src, *dst, *tmp;
|
|
|
|
// int i, j, kk, channels;
|
|
|
|
// int index;
|
|
|
|
// int widthStep;
|
|
|
|
// int tW, tH;
|
|
|
|
//
|
|
|
|
// W = (float)img->width;
|
|
|
|
// H = (float)img->height;
|
|
|
|
// channels = img->nChannels;
|
|
|
|
// widthStep = img->widthStep;
|
|
|
|
//
|
|
|
|
// tW = (int)(((float)W) * scale + 0.5f);
|
|
|
|
// tH = (int)(((float)H) * scale + 0.5f);
|
|
|
|
//
|
|
|
|
// src = (float *)malloc(sizeof(float) * (int)(W * H) * 3);
|
|
|
|
//
|
|
|
|
// index = 0;
|
|
|
|
// for (kk = 0; kk < channels; kk++)
|
|
|
|
// {
|
|
|
|
// for (i = 0; i < W; i++)
|
|
|
|
// {
|
|
|
|
// for (j = 0; j < H; j++)
|
|
|
|
// {
|
|
|
|
// src[index++] = (float)(*( (float *)(img->imageData + j * widthStep) + i * channels + kk));
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// imgTmp = cvCreateImage(cvSize(tW , tH), IPL_DEPTH_32F, channels);
|
|
|
|
//
|
|
|
|
// dst = (float *)malloc(sizeof(float) * (int)(tH * tW) * channels);
|
|
|
|
// tmp = (float *)malloc(sizeof(float) * (int)(tH * W) * channels);
|
|
|
|
//
|
|
|
|
// resize1dtran(src, (int)H, tmp, (int)tH, (int)W , 3);
|
|
|
|
//
|
|
|
|
// resize1dtran(tmp, (int)W, dst, (int)tW, (int)tH, 3);
|
|
|
|
//
|
|
|
|
// index = 0;
|
|
|
|
// for (kk = 0; kk < channels; kk++)
|
|
|
|
// {
|
|
|
|
// for (i = 0; i < tW; i++)
|
|
|
|
// {
|
|
|
|
// for (j = 0; j < tH; j++)
|
|
|
|
// {
|
|
|
|
// dataf = (float *)(imgTmp->imageData + j * imgTmp->widthStep);
|
|
|
|
// dataf[ i * channels + kk] = dst[index++];
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// free(src);
|
|
|
|
// free(dst);
|
|
|
|
// free(tmp);
|
|
|
|
// return imgTmp;
|
|
|
|
//}
|
|
|
|
//
|