中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

opencv如何實現圖像傾斜校正

發布時間:2022-08-01 11:21:23 來源:億速云 閱讀:389 作者:iii 欄目:開發技術

今天小編給大家分享一下opencv如何實現圖像傾斜校正的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

opencv如何實現圖像傾斜校正

今天的任務是如圖這兩種情況,我現在的情況是和如圖一樣的,左圖左邊傾斜一點兒,那么我需要把左邊壓低傾斜校正。右圖,右邊傾斜我需要把右邊下壓到水平位置傾斜校正。我的場景不會有大角度的傾斜,就這么點可能的不會超過45°的小角度。
標準的傳統圖像處理方法。首先就是灰度,二值化,取輪廓,篩選得到目標(面積最大的那個),得到傾斜角度,轉正。
具體過程就不詳細說了,都在代碼里面一看就懂。效果圖如下:

opencv如何實現圖像傾斜校正

#include <iostream>
#include"opencv2/opencv.hpp"
using namespace std;
using namespace cv;


bool cmp_x(cv::Point pt1, cv::Point pt2)
{
    return (pt1.x < pt2.x);
}

cv::Point2f get_mid_pt(cv::Point2f pt1, cv::Point2f pt2)
{
    return cv::Point2f((pt1.x + pt2.x)/2.0,(pt1.y + pt2.y) / 2.0);
}

double get_point_angle(cv::Point2f pointO,cv::Point2f pointA)
{
    double angle = 0;
    cv::Point2f point;
    double temp;
    point = cv::Point2f((pointA.x - pointO.x), (pointA.y - pointO.y));

    if ((0==point.x) && (0==point.y))
    {
        return 0;
    }

    if (0==point.x)
    {
        angle = 90;
        return angle;
    }

    if (0==point.y)
    {
        angle = 0;
        return angle;
    }

    temp = fabsf(float(point.y)/float(point.x));
    temp = atan(temp);
    temp = temp*180/CV_PI ;

    if ((0<point.x)&&(0<point.y))
    {
        angle = 360 - temp;
        return angle;
    }

    if ((0>point.x)&&(0<point.y))
    {
        angle = 360 - (180 - temp);
        return angle;
    }

    if ((0<point.x)&&(0>point.y))
    {
        angle = temp;
        return angle;
    }

    if ((0>point.x)&&(0>point.y))
    {
        angle = 180 - temp;
        return angle;
    }

    printf("sceneDrawing :: getAngle error!");
    return -1;
}

int RotateImage(const cv::Mat &src, double angle, cv::Mat &dst, cv::Mat &rot_matrix, bool crop = true, int flags = cv::INTER_NEAREST,
                int borderMode = cv::BORDER_CONSTANT, const cv::Scalar &borderValue = cv::Scalar())
{
    if(0 == src.cols * src.rows) { return 0;}
    cv::Point2f center(src.cols / 2.0f, src.rows / 2.0f);
    rot_matrix = cv::getRotationMatrix2D(center, angle, 1.0);
    if (crop) {
        if (dst.data == NULL) {
            dst = cv::Mat(src.rows, src.cols, src.type());
        }
    } else {
        cv::Rect bbox = cv::RotatedRect(center, cv::Size2f(src.cols, src.rows), angle).boundingRect();
        double *p = (double *) rot_matrix.data;
        p[2] += bbox.width / 2.0 - center.x;
        p[5] += bbox.height / 2.0 - center.y;
        if (dst.rows != bbox.height || dst.cols != bbox.width) {
            dst = cv::Mat(bbox.height, bbox.width, src.type());
        }
    }
    cv::warpAffine(src, dst, rot_matrix, dst.size(), flags, borderMode, borderValue);
    return 0;
}


int main(int argc, char *argv[])
{
    cv::Mat img = cv::imread("/data_1/everyday/0325/13.jpeg");

    cv::Mat m_gray,m_bi;
    cv::cvtColor(img,m_gray,CV_BGR2GRAY);
    cv::threshold(m_gray,m_bi,100,255,THRESH_BINARY_INV);

    vector<vector<Point>> contours;
    vector<Vec4i> hierarchy;
    findContours(m_bi,contours,hierarchy,RETR_TREE,CHAIN_APPROX_SIMPLE,Point());

    RotatedRect rt_rot_max,rt_tmp;
    int max_szie = -1;
    for(int i=0;i<contours.size();i++)
    {
        rt_tmp = minAreaRect(Mat(contours[i]));
        if(rt_tmp.size.area() > max_szie)
        {
            max_szie = rt_tmp.size.area();
            rt_rot_max = rt_tmp;
        }
    }
    std::vector<cv::Point2f> v_pt(4);
    rt_rot_max.points(v_pt.data());

    std::sort(v_pt.begin(),v_pt.end(),cmp_x);

    cv::Point2f pt_left = get_mid_pt(v_pt[0], v_pt[1]);
    cv::Point2f pt_right = get_mid_pt(v_pt[2], v_pt[3]);

    double ang = get_point_angle(pt_left,pt_right);
    std::cout<<"ang="<<ang<<std::endl;

    cv::circle(img,v_pt[0],6,Scalar(50,12,189),3);
    cv::circle(img,v_pt[1],6,Scalar(10,255,255),3);
    cv::circle(img,v_pt[2],6,Scalar(150,120,19),3);
    cv::circle(img,v_pt[3],6,Scalar(0,0,0),3);

    cv::Mat m_rot,rot_matrix;
    RotateImage(img, -ang, m_rot, rot_matrix, false);

    cv::imshow("m_rot",m_rot);
    cv::imshow("m_bi",m_bi);
    cv::imshow("m_gray",m_gray);
    cv::imshow("img",img);
    cv::waitKey(0);

    return 0;
}

以上就是“opencv如何實現圖像傾斜校正”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

杭锦旗| 凤台县| 紫云| 新宾| 仁怀市| 玉田县| 沙河市| 德江县| 渝北区| 临海市| 时尚| 芦溪县| 柞水县| 安义县| 巧家县| 太仓市| 星子县| 兴义市| 柏乡县| 广水市| 德令哈市| 安顺市| 东平县| 徐闻县| 茶陵县| 翁牛特旗| 铁力市| 抚州市| 晋江市| 沁水县| 常州市| 吴堡县| 同德县| 紫金县| 沽源县| 城口县| 依兰县| 越西县| 承德县| 武平县| 长寿区|