最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

opencv實現(xiàn)圖像傾斜校正

 更新時間:2022年07月30日 16:50:54   作者:無左無右  
這篇文章主要為大家詳細(xì)介紹了opencv實現(xiàn)圖像傾斜校正,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了opencv實現(xiàn)圖像傾斜校正的具體代碼,供大家參考,具體內(nèi)容如下

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

#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;
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++筆記-設(shè)置cout輸出數(shù)據(jù)的寬度和填充方式

    C++筆記-設(shè)置cout輸出數(shù)據(jù)的寬度和填充方式

    這篇文章主要介紹了C++筆記-設(shè)置cout輸出數(shù)據(jù)的寬度和填充方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++引用和指針的區(qū)別你知道嗎

    C++引用和指針的區(qū)別你知道嗎

    這篇文章主要為大家介紹了C++引用和指針的區(qū)別,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助<BR>
    2022-01-01
  • 詳解C語言數(shù)組靈活多變的訪問形式

    詳解C語言數(shù)組靈活多變的訪問形式

    這篇文章主要介紹了詳解C語言數(shù)組靈活多變的訪問形式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • C語言實現(xiàn)班級檔案管理系統(tǒng)課程設(shè)計

    C語言實現(xiàn)班級檔案管理系統(tǒng)課程設(shè)計

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)班級檔案管理系統(tǒng)課程設(shè)計,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C++實現(xiàn)單張圖片讀取和保存

    C++實現(xiàn)單張圖片讀取和保存

    這篇文章主要為大家詳細(xì)介紹了C++語言讀取和保存單張圖片的代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • C++創(chuàng)建窗口程序的實現(xiàn)示例

    C++創(chuàng)建窗口程序的實現(xiàn)示例

    Windows窗體應(yīng)用程序是C#語言中的一個重要應(yīng)用,本文主要介紹了C++創(chuàng)建窗口程序的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • 關(guān)于C++靜態(tài)數(shù)據(jù)成員的實現(xiàn)講解

    關(guān)于C++靜態(tài)數(shù)據(jù)成員的實現(xiàn)講解

    今天小編就為大家分享一篇關(guān)于關(guān)于C++靜態(tài)數(shù)據(jù)成員的實現(xiàn)講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • C語言排序方法(冒泡,選擇,插入,歸并,快速)

    C語言排序方法(冒泡,選擇,插入,歸并,快速)

    這篇文章給大家分享C語言所有經(jīng)典排序方法,文章給大家提供完整的實例代碼幫助大家快速學(xué)習(xí)掌握C語言排序方法,感興趣的朋友一起看看吧
    2021-08-08
  • 淺談2路插入排序算法及其簡單實現(xiàn)

    淺談2路插入排序算法及其簡單實現(xiàn)

    這篇文章主要介紹了淺談2路插入排序算法及其簡單實現(xiàn),雖算不上是常用的排序方法,但在數(shù)據(jù)庫等方面依然有用上的機會,需要的朋友可以參考下
    2015-08-08
  • C++ Primer 第一部分基本語言

    C++ Primer 第一部分基本語言

    這篇文章主要介紹了C++ Primer 第一部分基本語言的相關(guān)資料,需要的朋友可以參考下
    2014-02-02

最新評論

黑水县| 曲阳县| 罗平县| 天峨县| 本溪市| 松阳县| 丽水市| 贵港市| 砚山县| 韩城市| 大安市| 阿瓦提县| 于田县| 呼伦贝尔市| 商河县| 遂宁市| 水富县| 城固县| 安陆市| 商南县| 女性| 衡南县| 九江市| 思茅市| 舒兰市| 义马市| 普定县| 襄城县| 潜山县| 东乌珠穆沁旗| 祁阳县| 南丹县| 顺义区| 淮阳县| 涟水县| 吉木乃县| 准格尔旗| 姜堰市| 额尔古纳市| 灵璧县| 樟树市|