2016-10-27 10 views
1

のためのアルゴリズムは、私は私が望んでいた結果(下記のように画像) enter image description hereOpenCVの:簡単な画像の回転、縮小

for (int r = 0;r < image1.rows;r++) { 

    for (int c = r + 1;c < image1.cols;c++) { 
     Point center = Point(image1.cols/2, image1.rows/2); 
     Point center1 = Point(image1.cols/2, image1.rows/2); 
     double angle = 90.0; 
     double scale = 1; 
     double angle1 = 90.0; 
     double scale1 = 0.5; 
     rotation = getRotationMatrix2D(center, angle, scale); 
     rotation1 = getRotationMatrix2D(center1, angle1, scale1); 

が、私を得たgetRotationMatrix2D(center, angle, scale);warpAffine(image1, image3, rotation, image3.size()); で画像の回転や削減(JPEG)を試してみました同じ結果を得るためにライブラリ を使用せずに単純な回転と縮小のアルゴリズム(私のような初心者にとっては簡単)を学びたい。 さまざまなソリューションを検索した後、私はこれで終わりました enter image description here からhttps://gamedev.stackexchange.com/questions/67613/how-can-i-rotate-a-bitmap-without-d3d-or-opengl 誰かが私のペイズーコードに関して私に説明するために単純な線形代数の少しずつ解読できますか?

EDIT:この例では 削減コード

 void reduction(Mat image1) 
    { 
     for (int r = 0;r < imgC.rows;r++) 
     { 
     for (int c = 0;c < imgC.cols;c++) 
    { 


     int new_x = c * (125/256); 
     int new_y = r * (125/256); 
     imgC.at<uchar>(r, c) = imgC.at<uchar>(new_y, new_x); 
     } 
    } 
} 

enter image description here

答えて

0

私は2枚の画像をロードしています。 1つはグレースケールであり、他はカラー画像である。どちらも同じイメージなので、数学的方程式で回転を扱う方法を簡単に理解できます。非常に理解しやすいこの例を見てください。同様の方法で、スケーリングと縮小を追加することもできます。ここで、各点は、新しい位置に設定された方程式と色の値に従って変換されます。コードは次のとおりです。

#include <iostream> 
#include <string> 
#include "opencv/highgui.h" 
#include "opencv2/imgproc/imgproc.hpp" 
#include "opencv2/objdetect/objdetect.hpp" 

using namespace std; 
using namespace cv; 

#define PIPI 3.14156 

int main() 
{ 
    Mat img = imread("C:/Users/dell2/Desktop/DSC00587.JPG",0);//loading gray scale image 
    Mat imgC = imread("C:/Users/dell2/Desktop/DSC00587.JPG",1);//loading color image 

    Mat rotC(imgC.cols, imgC.rows, imgC.type()); 
    rotC = Scalar(0,0,0); 

    Mat rotG(img.cols, img.rows, img.type()); 
    rotG = Scalar(0,0,0); 

    float angle = 90.0 * PIPI/180.0; 

    for(int r=0;r<imgC.rows;r++) 
    { 
     for(int c=0;c<imgC.cols;c++) 
     { 
      float new_px = c * cos(angle) - r * sin(angle); 
      float new_py = c * sin(angle) + r * cos(angle); 

      Point pt((int)-new_px, (int)new_py); 

      //color image 
      rotC.at<Vec3b>(pt) = imgC.at<Vec3b>(r,c);//assign color value at new location from original image 

      //gray scale image 
      rotG.at<uchar>(pt) = img.at<uchar>(r,c);//assign color value at new location from original image 

     } 
    } 


    imshow("color",rotC); 
    imshow("gray",rotG); 
    waitKey(0); 

    return 0; 
} 
+0

ありがとうございました!このコードは90度しかサポートできませんが?私は(180度、270度)のような他の様々な量を入力しようとしたが、それはちょうど私にエラーを与える。 -new_pxの " - "記号とは何ですか? – Lyber

+0

-ve記号はx値が負になることによるもので、通常の座標系では問題ありません。しかし、画像処理では、左上点が(0,0)、下点、右点(w、h)であることを知っています...カスタム角度の場合、角度や画像寸法を計算する必要があるため複雑になります。 45度回転し、同じキャンバスサイズで回転させた画像に収まるようにするには、画像を縮小する必要があります。また、90,270度の画像寸法は交換されます。通常、画像の大きさは同じにして、回転した画像のサイズをキャンバスの下に合わせるように調整します。 –

+0

あなたの答えをありがとう、私は私のリダクションコード(編集されたポスト)を追加しただけで、うまくいきません。 – Lyber

関連する問題