资源简介

该程序可以实现读取图片,然后将图片校正

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 

using namespace std;
using namespace cv;

cv::Point2f center(0 0);


bool sort_corners(std::vector& corners)
{
    std::vector top bot;
    cv::Point2f tmp_pt;
    std::vector olddata = corners;

    if (corners.size() != 4)
    {
        return false;
    }

    for (size_t i = 0; i < corners.size(); i++)
    {
        for (size_t j = i + 1; j        {
            if (corners[i].y < corners[j].y)
            {
                tmp_pt = corners[i];
                corners[i] = corners[j];
                corners[j] = tmp_pt;
            }
        }
    }
    top.push_back(corners[0]);
    top.push_back(corners[1]);
    bot.push_back(corners[2]);
    bot.push_back(corners[3]);
    if (top.size() == 2 && bot.size() == 2) {
        corners.clear();
        cv::Point2f tl = top[0].x > top[1].x ? top[1] : top[0];
        cv::Point2f tr = top[0].x > top[1].x ? top[0] : top[1];
        cv::Point2f bl = bot[0].x > bot[1].x ? bot[1] : bot[0];
        cv::Point2f br = bot[0].x > bot[1].x ? bot[0] : bot[1];
        corners.push_back(tl);
        corners.push_back(tr);
        corners.push_back(br);
        corners.push_back(bl);
        return true;
    }
    else
    {
        corners = olddata;
        return false;
    }
}

cv::Point2f computeIntersect(cv::Vec4i a cv::Vec4i b)
{
    int x1 = a[0] y1 = a[1] x2 = a[2] y2 = a[3];
    int x3 = b[0] y3 = b[1] x4 = b[2] y4 = b[3];

    if (float d = ((float)(x1 - x2) * (y3 - y4)) - ((y1 - y2) * (x3 - x4)))
    {
        cv::Point2f pt;
        pt.x = ((x1*y2 - y1*x2) * (x3 - x4) - (x1 - x2) * (x3*y4 - y3*x4)) / d;
        pt.y = ((x1*y2 - y1*x2) * (y3 - y4) - (y1 - y2) * (x3*y4 - y3*x4)) / d;
        return pt;
    }
    else
        return cv::Point2f(-1 -1);
}

bool IsBadLine(int a int b)
{
    if (a * a + b * b < 100)
    {
        return true;
    }
    else
    {
        return false;
    }
}

bool x_sort(const Point2f & m1 const Point2f & m2)
{
    return m1.x < m2.x;
}

//确定四个点的中心线
void sortCorners(std::vector& corners
    cv::Point2f center)
{
    std::vector top bot;
    vector backup = corners;

    sort(corners x_sort);  //注意先按x的大小给4个点排序

    for (int i = 0; i < corners.size(); i++)
    {
        if (corners[i].y < center.y && top.size() < 2)    //这里的小于2是为了避免三个顶点都在top的情况
            top.push_back(corners[i]);
        else
            bot.push_back(corners[i]);
    }
    corners.clear();

    if (top.size() == 2 && bot.size() == 2) 
    {
        cout << “log“ << endl;
        cv::Point2f tl = top[0].x > top[1].x ? top[1] : top[0];
        cv::Point2f tr = top[0].x > top[1].x ? top[0] : top[1];
        cv::Point2f bl = bot[0].x > bot[1].x ? bot[1] : bot[0];
        cv::Point2f br = bot[0].x > bot[1].x ? bot[0] : bot[1];


        corners.push_back(tl);
        corners.push_back(tr);

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2017-08-09 03:18  my_scanner-master\
     文件         378  2017-08-09 03:18  my_scanner-master\.gitattributes
     文件         574  2017-08-09 03:18  my_scanner-master\.gitignore
     文件       10743  2017-08-09 03:18  my_scanner-master\main.cpp
     目录           0  2017-08-09 03:18  my_scanner-master\test_img\
     文件      176722  2017-08-09 03:18  my_scanner-master\test_img\1.png
     文件      196358  2017-08-09 03:18  my_scanner-master\test_img\12.png
     文件      218907  2017-08-09 03:18  my_scanner-master\test_img\20.png
     文件      759969  2017-08-09 03:18  my_scanner-master\test_img\30.png
     文件       35525  2017-08-09 03:18  my_scanner-master\test_img\5.jpg
     文件      133263  2017-08-09 03:18  my_scanner-master\test_img\7.png
     文件      183098  2017-08-09 03:18  my_scanner-master\test_img\9.png
     文件      211927  2017-08-09 03:18  my_scanner-master\test_img\p1.png
     文件      197410  2017-08-09 03:18  my_scanner-master\test_img\p3.png
     文件      220067  2017-08-09 03:18  my_scanner-master\test_img\p4.png

评论

共有 条评论