/*------------------------------------------------------------------------
*
* Copyright (c) 1997-1998 by Cornell University.
*
* See the file "license.txt" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
* bytehomo.c
*
* Usage : bytehomo inputPGM outputPGM
*
* Given an input PPM file, perform homogeneous transformation on the input.
* Image will be transformed to a trapeziod with top = TARGET_WIDTH
* bottom = TARGET_WIDTH - 50 and height = TARGET_HEIGHT;
*
*------------------------------------------------------------------------
*/
#include "dvmbasic.h"
#include "dvmbytegeom.h"
#include "dvmpnm.h"
#define TARGET_WIDTH 200
#define TARGET_HEIGHT 100
void ReadPGM(char *, PnmHdr **, ByteImage **);
void WritePGM(PnmHdr *, ByteImage *, char *);
int main(int argc, char *argv[])
{
PnmHdr *hdr;
ByteImage *buf, *newbuf;
int w, h;
double a, b, d, e, m, n;
/*
* Parse the arguments, and read the input PGM.
*/
if (argc != 3) {
fprintf(stderr, "usage : %s input output\n", argv[0]);
exit(1);
}
ReadPGM (argv[1], &hdr, &buf);
/*
* Compute the homogeneuos transformation matrix.
*/
w = PnmHdrGetWidth (hdr);
h = PnmHdrGetHeight (hdr);
ByteHomoComputeMatrix (w, h,
TARGET_WIDTH, 0, TARGET_WIDTH - 50, TARGET_HEIGHT, 50, TARGET_HEIGHT,
&a, &b, &d, &e, &m, &n);
/*
* Allocate the output image and set the color to black.
*/
newbuf = ByteNew(TARGET_WIDTH, TARGET_HEIGHT);
ByteSet(newbuf, 0);
/*
* Perform the actual transformation.
*/
ByteHomo(buf, newbuf, a, b, 0, d, e, 0, m, n, 1);
/*
* Initialize the PnmHdr to the new width and height.
*/
PnmHdrSetWidth (hdr, TARGET_WIDTH);
PnmHdrSetHeight (hdr, TARGET_HEIGHT);
/*
* Output the image as an PGM file.
*/
WritePGM (hdr, newbuf, argv[2]);
/*
* Clean up.
*/
ByteFree(newbuf);
ByteFree(buf);
PnmHdrFree(hdr);
return 0;
}