お世話になります。
C言語での画像回転を行おうと思いますが、うまく行きません。
アドバイスを宜しくお願いします。
Vectorへ画像を入力して来て、回転を掛け(取り合えず90°)書き込むプログラムです。
outBufferには、800x1000の画像が正常に入って来ている事は、出力して確認しています。
画像中心点を中心とした回転アルゴリズムとしてネット上から下記を
探してきたのですが、x2,y2が(0,0)の時は、(0,800)が入ってくると考えていますが、計算結果が違います。
C++
1x1 = (((x2 - outCenX) * iCos - (y2 - outCenY) * iSin) >> 10) + centerX; 2y1 = (((x2 - outCenX) * iSin + (y2 - outCenY) * iCos) >> 10) + centerY;
使用方法が違うのでしょうか・・・。
下記、コード抜粋します。
C++
1//image rotation. 2int centerX, centerY; //入力画像中心点 3int outCenX, outCenY; //出力画像中心点 4 5int inWidht, inHeight; //画像サイズ(入力画像). 6int otWidht, otHeight; //画像サイズ(出力画像). 7double A ; //回転角度 8double p = 3.14159265358979323846; //円周率 9 10int iSin, iCos; //Sin Cos 最適化. 11int x_in, y_in; //入力画像の座標. 12int x_ot, y_ot; //出力画像の座標. 13 14A = 90.0; //取り急ぎ90. 15 16//三角関数の最適化(事前計算しておく) 17double valSin = sin(A); 18double valCos = cos(A); 19iSin = (int)(valSin * 1024); 20iCos = (int)(valCos * 1024); 21 22//入力画像サイズ 23x_in = 800; 24y_in = 1000; 25 26//出力画像の大きさ計算 27x_ot = 1000; 28y_ot = 800; 29//x_ot = (int)( fabs(x_in * cos(A)) + fabs(y_in * sin(A)) + 0.5 ); 30//y_ot = (int)( fabs(x_in * sin(A)) + fabs(y_in * cos(A)) + 0.5 ); 31 32//中心位置 33centerX = x_in / 2; 34centerY = y_in / 2; 35outCenX = x_ot / 2; 36outCenY = y_ot / 2; 37 38// 回転処理 39std::vector<char> outRotatBuffer; 40int x1, y1; 41for(int y2 = 0; y2 < y_ot; y2++) 42{ 43 for(int x2 = 0; x2 < x_ot * 2; x2++) 44 { 45 // 回転位置計算(移動先の座標から元画像の座標計算) 46 x1 = (((x2 - outCenX) * iCos - (y2 - outCenY) * iSin) >> 10) + centerX; 47 y1 = (((x2 - outCenX) * iSin + (y2 - outCenY) * iCos) >> 10) + centerY; 48 49 50 51 try{ 52 outRotatBuffer.push_back( outBuffer.at( (x1 + y1 ) * 2 ) ); 53 }catch(std::exception e){ 54 error = true; 55 } 56 } 57}
宜しくお願い致します。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/05/14 10:15
2016/05/14 12:31
2016/05/16 01:03
2016/05/16 01:24
2016/05/16 03:06
2016/05/16 11:43 編集
2016/05/17 02:57 編集