#include #include #include "cv.h" #include "cxcore.h" #include "highgui.h" #pragma comment(lib,"cv.lib") #pragma comment(lib,"cxcore.lib") #pragma comment(lib,"highgui.lib") void rotationOption(unsigned char *out, unsigned char *in, int inHeight, int inWidth, int inChannel, double theta, int centerX, int centerY); int main(){ IplImage *in, *out; in = cvLoadImage("./image640.bmp", 0); out = cvCreateImage(cvSize(in->width, in->height), in->depth, in->nChannels); rotationOption((unsigned char*)out->imageData, (unsigned char*)in->imageData, in->height, in->width, in->nChannels, 15.0, 0, 0); cvNamedWindow("in", 1); cvShowImage("in", in); cvNamedWindow("out", 1); cvShowImage("out", out); cvWaitKey(-1); cvDestroyWindow("in"); cvDestroyWindow("out"); cvReleaseImage( &in ); cvReleaseImage( &out ); return 0; } void rotationOption(unsigned char *out, unsigned char *in, int inHeight, int inWidth, int inChannel, double theta, int centerX, int centerY){ int i, j; int index; int widthStep; int pointX, pointY; double radian = theta / 180.0 * 3.14159265; double cosRadian = cos(radian); double sinRadian = sin(radian); widthStep = inWidth * inChannel; if(widthStep % 4 != 0){ widthStep = widthStep + 4 - widthStep % 4; } for(i = 0; i < inHeight; ++i){ for(j = 0; j < inWidth; ++j){ pointX = (int)((j - centerX) * cosRadian - (i - centerY) * sinRadian + centerX); pointY = (int)((j - centerX) * sinRadian + (i - centerY) * cosRadian + centerY); // poiuntX, pointYが入力画像の有効範囲にあれば出力画像へ代入する if(pointX >= 0 && pointX < inWidth && pointY >= 0 && pointY < inHeight){ out[i * widthStep + j] = in[pointY * widthStep + pointX]; } else { out[i * widthStep + j] = 0; } } } }