• OpenCV——Skewing


    // define head function
    #ifndef PS_ALGORITHM_H_INCLUDED
    #define PS_ALGORITHM_H_INCLUDED
    
    #include <iostream>
    #include <string>
    #include "cv.h"
    #include "highgui.h"
    #include "cxmat.hpp"
    #include "cxcore.hpp"
    #include "math.h"
    
    using namespace std;
    using namespace cv;
    
    void Show_Image(Mat&, const string &);
    
    #endif // PS_ALGORITHM_H_INCLUDED
    
    
    #include "PS_Algorithm.h"
    #include <time.h>
    
    using namespace std;
    using namespace cv;
    
    #define pi 3.1415926
    
    int main()
    {
        string Img_name("4.jpg");
        Mat Img;
        Img=imread(Img_name);
    
        float theta=pi/6;
    
        int width=Img.cols;
        int height=Img.rows;
    
        /*
        // horizontal skewing
        int new_height=height;
        int new_width=width+height*tan(theta)+1;
        Mat Img_H=Mat::zeros(new_height,new_width, CV_8UC3);
    
        float Dis;
        float new_x, new_y;
        float x1, y1, p;
        for (int y=0; y<new_height; y++)
        {
            Dis=(height-y)*tan(theta);
            for (int x=0; x<new_width; x++)
            {
                new_y=y;
               // right skew
               //  new_x=x-Dis;
               // left skew
                 new_x=x+Dis-height*tan(theta);
    
              // if (new_x<0) new_x=0;
              // if (new_x>width-1) new_x=width-2;
    
              if (new_x>0 && new_x<width-1)
              {
                    x1=int(new_x);
                    y1=int(new_y);
                    p=new_x-x1;
    
                    Img_H.at<Vec3b>(y,x)[0]=(1-p)*Img.at<Vec3b>(y1,x1)[0]+p*Img.at<Vec3b>(y1,x1+1)[0];
                    Img_H.at<Vec3b>(y,x)[1]=(1-p)*Img.at<Vec3b>(y1,x1)[1]+p*Img.at<Vec3b>(y1,x1+1)[1];
                    Img_H.at<Vec3b>(y,x)[2]=(1-p)*Img.at<Vec3b>(y1,x1)[2]+p*Img.at<Vec3b>(y1,x1+1)[2];
    
              }
    
            }
        }
        Show_Image(Img_H, "out");
        imwrite("H.jpg", Img_H);
        */
    
    
        // vertical skewing
        int new_height=height+width*tan(theta)+1;
        int new_width=width;
        Mat Img_V=Mat::zeros(new_height,new_width, CV_8UC3);
    
        float Dis;
        float new_x, new_y;
        float x1, y1, p;
        for (int y=0; y<new_height; y++)
        {
    
            for (int x=0; x<new_width; x++)
            {
                Dis=x*tan(theta);
                new_x=x;
               // right skew
               new_y=y-Dis;
               // left skew
               //  new_y=y+Dis-width*tan(theta);
    
              if (new_y>0 && new_y<height-1)
              {
                    x1=int(new_x);
                    y1=int(new_y);
                    p=new_y-y1;
    
                    Img_V.at<Vec3b>(y,x)[0]=(1-p)*Img.at<Vec3b>(y1,x1)[0]+p*Img.at<Vec3b>(y1+1,x1)[0];
                    Img_V.at<Vec3b>(y,x)[1]=(1-p)*Img.at<Vec3b>(y1,x1)[1]+p*Img.at<Vec3b>(y1+1,x1)[1];
                    Img_V.at<Vec3b>(y,x)[2]=(1-p)*Img.at<Vec3b>(y1,x1)[2]+p*Img.at<Vec3b>(y1+1,x1)[2];
    
              }
    
            }
        }
        Show_Image(Img_V, "out");
        imwrite("V.jpg", Img_V);
    
    
        waitKey();
    
    }
    
    
    // define the show image
    #include "PS_Algorithm.h"
    #include <iostream>
    #include <string>
    
    using namespace std;
    using namespace cv;
    
    void Show_Image(Mat& Image, const string& str)
    {
        namedWindow(str.c_str(),CV_WINDOW_AUTOSIZE);
        imshow(str.c_str(), Image);
    
    }
    


    原图 


    效果图



  • 相关阅读:
    Codeforces Round #547 F1&F2. Same Sum Blocks(贪心)
    Codeforces Round #547 D. Colored Boots(贪心)
    Codeforces Round #547 C. Polycarp Restores Permutation(二分枚举/数学+模拟)
    CCF 201812-4 数据中心(最小生成树)
    CCF【小明放学&小明上学】
    TIME_WAIT状态
    ping的详细过程
    两段不相邻子段和之和最大
    神水一题之“Who's in the Middle”
    日进一步之“A Knight's Journey”
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/7182413.html
Copyright © 2020-2023  润新知