⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ofdraw.c

📁 image processing including fourier,wavelet,segmentation etc.
💻 C
字号:
/*--------------------------- MegaWave2 module  -----------------------------*//* mwcommand name = {ofdraw}; author = {"Lionel Moisan"}; version = {"1.0"}; function = {"Draw optical flow data"}; usage = {   'a'->a          "do NOT draw arrows",   'm':[m=0.]->m   "minimum norm threshold for drawing, default 0.",   'p':[p=8]->p    "grid step for drawing, default 8, integer",   'z':[z=2]->z    "zoom factor, default 2, integer",   'h':[h=20]->h   "height of a unit speed vector in pixels, default 20",   U->U            "optical flow (input Fmovie of X coordinates)",   V->V            "optical flow (input Fmovie of Y coordinates)",   out<-ofdraw     "output Cmovie"};*/#include <stdio.h>#include <math.h>#include "mw.h"extern double floor();int dirx[8]={1,1,0,-1,-1,-1,0,1};int diry[8]={0,1,1,1,0,-1,-1,-1};void draw_arrow(u,x,y,angle,c)     Cimage u;     int x,y;     double angle;     unsigned char c;{  int n,i,j,dx,dy,a;  n = u->ncol;  a = ((int)floor(angle*4./M_PI+8.5))%8;  dx = dirx[a];  dy = diry[a];    if (a%2)    /* tilted arrow */    for (i=0;i<=3;i++)      for (j=0;j<=3-i;j++) 	u->gray[(y-dy*j)*n+x-dx*i]=c;  else if (dx==0)    /* vertical arrow */    for (i=0;i<=2;i++)      for (j=-i;j<=i;j++) 	u->gray[(y-dy*i)*n+x-j]=c;  else     /* horizontal arrow */    for (i=0;i<=2;i++)      for (j=-i;j<=i;j++) 	u->gray[(y-j)*n+x-dx*i]=c;}/*------------------------------ MAIN MODULE ------------------------------*/Cmovie ofdraw(U,V,a,m,p,z,h)     Fmovie U,V;     float *m,*h;     int *p,*z,*a;{  Cmovie out;  Cimage new,prev,*next;  Fimage X,Y;  int ix,iy,nx,ny,fx,fy;  float vx,vy;  out = mw_new_cmovie();  next = &(out->first);  prev = NULL;  for (X=U->first,Y=V->first;X&&Y;X=X->next,Y=Y->next) {    nx = X->ncol; ny = X->nrow;    new = mw_change_cimage(NULL,*z*ny,*z*nx);    new->previous = prev;    *next = prev = new;    next = &(new->next);    mw_clear_cimage(new,255);    for (ix=*p;ix<nx;ix+=*p)      for (iy=*p;iy<ny;iy+=*p) {	vx = X->gray[iy*nx+ix];	vy = Y->gray[iy*nx+ix];	if (vx*vx+vy*vy>*m*(*m)) {	  fx = *z*ix+(int)floor((double)(*h*vx+0.5));	  fy = *z*iy+(int)floor((double)(*h*vy+0.5));	  if (fx>=3 && fx<new->ncol-3 && fy>=3 && fy<new->nrow-3) {	    mw_draw_cimage(new,*z*ix,*z*iy,fx,fy,0);	    if (!a) draw_arrow(new,fx,fy,atan2((double)vy,(double)vx),0);	  } 	}	new->gray[(*z*iy)*new->ncol+*z*ix] = 0;      }  }  *next = NULL;  return(out);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -