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

OpenCV實現(xiàn)繞圖片中任意角度旋轉任意角度

 更新時間:2022年09月29日 08:30:38   作者:萬丈高樓平地起  
這篇文章主要為大家詳細介紹了在圖片不被裁剪時,opencv如何實現(xiàn)繞圖片中任意點旋轉任意角度,文中的示例代碼講解詳細,需要的可以參考一下

最近在做項目需要把把圖片繞圖片中任意點旋轉任意角度,考慮到自己旋轉需要編寫插值算法,所以想到了用opencv,但是網(wǎng)上都是圍繞圖片中點旋轉任意角度的,都是向下面這樣寫的:

繞圖片中心旋轉圖片不裁剪

#include"opencv.hpp"
#include<iostream>
using namespace std;
using namespace cv;
int main() {
	Mat src = imread("timg.jpg");
	Mat des,m;
	Point2f center = Point(src.cols / 2, src.rows / 2);
	double angle = 50,scale=0.5;
	int w = src.cols, h = src.rows;
	int bound_w = (h * fabs(sin(angle * CV_PI / 180)) + w * fabs(cos(angle * CV_PI / 180))) * scale;
	int bound_h = (h * fabs(cos(angle * CV_PI / 180)) + w * fabs(sin(angle * CV_PI / 180))) * scale;
	m = getRotationMatrix2D(center, angle, scale);
	m.at<double>(0, 2) += (bound_w - src.cols) / 2;
	m.at<double>(1, 2) += (bound_h - src.rows) / 2;
	
	warpAffine(src,des,m,Size2i(bound_h,bound_w));
	imshow("image",des);
	waitKey();
	return 0;

旋轉之后的效果: 

但是遇到繞任意點旋轉時,會產(chǎn)生問題,用這種方式還是會存在裁剪,如果要理解繞任意點旋轉,需要先理解函數(shù)getRotationMatrix2D,這個函數(shù)處理過程如下面矩陣表示所示:

具體實現(xiàn)代碼如下:

    Mat src = imread("/home/sss/1111.jpg", IMREAD_GRAYSCALE);
    Mat des, m;
//旋轉的任意角度
    double angle = 45;
    int w = src.cols, h = src.rows;
    Point2f rorate_center;
//旋轉的任意中心
    rorate_center.x = w;
    rorate_center.y = h;
//重新計算旋轉后的寬和高
    int bound_w = ceil(h * fabs(sin(angle * CV_PI / 180.0)) + w * fabs(cos(angle * CV_PI / 180.0)));
    int bound_h = ceil(h * fabs(cos(angle * CV_PI / 180.0)) + w * fabs(sin(angle * CV_PI / 180.0)));
    m = getRotationMatrix2D(rorate_center, angle, 1.0);

//通過eigen計算旋轉矩陣
    Eigen::Matrix3d T1;
    T1 << 1, 0, -rorate_center.x,
            0, 1, -rorate_center.y,
            0, 0, 1;
    Eigen::Matrix3d T2;
    T2 <<   1, 0, rorate_center.x,
            0, 1, rorate_center.y,
            0, 0, 1;
    Eigen::Matrix3d rorate;
    rorate << cos(angle * CV_PI / 180.0), sin(angle * CV_PI / 180.0), 0,
            -sin(angle * CV_PI / 180.0), cos(angle * CV_PI / 180.0), 0,
            0, 0, 1;
    Eigen::Matrix3d T = T2 * rorate * T1;
//計算原來矩陣的四個頂點經(jīng)過變換后的頂點
    Eigen::Matrix<double,3, 1> left_top_p, right_top_p, right_bottom_p, left_botoom_p;
    left_top_p << 0, 0, 1;
    right_top_p << w, 0, 1;
    right_bottom_p << w, h, 1;
    left_botoom_p << 0, h , 1;
    left_top_p = T * left_top_p;
    right_top_p = T * right_top_p;
    right_bottom_p = T * right_bottom_p;
    left_botoom_p = T * left_botoom_p;

//找到經(jīng)過變換過定位的最大最小值
    double min_x = 10000, min_y = 10000;
    //min_x
    if(left_top_p[0] < min_x){
        min_x = left_top_p[0];
    }
    if(right_top_p[0] < min_x){
        min_x = right_top_p[0];
    }
    if(right_bottom_p[0] < min_x)
    {
        min_x = right_bottom_p[0];
    }
    if(left_botoom_p[0] < min_x){
        min_x = left_botoom_p[0];
    }

    //min_y
    if(left_top_p[1] < min_y){
        min_y = left_top_p[1];
    }
    if(right_top_p[1] < min_y){
        min_y = right_top_p[1];
    }
    if(right_bottom_p[1] < min_y)
    {
        min_y = right_bottom_p[1];
    }
    if(left_botoom_p[1] < min_y){
        min_y = left_botoom_p[1];
    }

    double max_x = -1000, max_y = -1000;
    //max_x
    if(left_top_p[0] > max_x){
        max_x = left_top_p[0];
    }
    if(right_top_p[0] > max_x){
        max_x = right_top_p[0];
    }
    if(right_bottom_p[0] > max_x)
    {
        max_x = right_bottom_p[0];
    }
    if(left_botoom_p[0] > max_x){
        max_x = left_botoom_p[0];
    }

    //max_y
    if(left_top_p[1] > max_y){
        max_y = left_top_p[1];
    }
    if(right_top_p[1] > max_y){
        max_y = right_top_p[1];
    }
    if(right_bottom_p[1] > max_y)
    {
        max_y = right_bottom_p[1];
    }
    if(left_botoom_p[1] > max_y){
        max_y = left_botoom_p[1];
    }

    //將偏置添加到矩陣中
    m.at<double>(0, 2) += -min_x;
    m.at<double>(1, 2) += -min_y;

//變換,最后不會存在裁剪
    warpAffine(src, des , m , Size2i(bound_w , bound_h),
               INTER_LINEAR, 0, Scalar(100, 100, 100));
    imwrite("/home/sss/222.jpg", des);
    return 0;

經(jīng)過變換過的圖片不會存在裁剪:

到此這篇關于OpenCV實現(xiàn)繞圖片中任意角度旋轉任意角度的文章就介紹到這了,更多相關OpenCV圖片旋轉內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++實現(xiàn)特殊矩陣的壓縮存儲算法

    C++實現(xiàn)特殊矩陣的壓縮存儲算法

    在實際存儲時,會發(fā)現(xiàn)矩陣中有許多值相同的數(shù)據(jù)或有許多零數(shù)據(jù),且分布呈現(xiàn)出一定的規(guī)律,稱這類型的矩陣為特殊矩陣。本文將利用C++實現(xiàn)特殊矩陣的壓縮存儲,感興趣的可以了解一下
    2022-08-08
  • c++ 實現(xiàn)文件逐行讀取與字符匹配

    c++ 實現(xiàn)文件逐行讀取與字符匹配

    這里嘗試通過C++來實現(xiàn)一個文件IO的功能,看看是否能夠比python的表現(xiàn)更好一些,感興趣的朋友可以參考下
    2021-05-05
  • 利用Matlab制作一款狗頭翻牌子小游戲

    利用Matlab制作一款狗頭翻牌子小游戲

    本文將用Matlab制作一個狗頭翻牌子的小游戲,就是點擊一個牌子時,該牌子和周圍四個牌子也會相應發(fā)生變化,想辦法讓所有牌子都在同一面即為游戲勝利。感興趣的可以跟隨小編學習一下
    2022-03-03
  • 使用C語言打印月歷

    使用C語言打印月歷

    這篇文章主要為大家詳細介紹了使用C語言打印月歷,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 如何基于 Blueprint 在游戲中創(chuàng)建實時音視頻功能

    如何基于 Blueprint 在游戲中創(chuàng)建實時音視頻功能

    我們在本文先來講講如何在 Unreal 中用 Blueprint 快速實現(xiàn)。稍后會分享基于 C++的實現(xiàn)步驟。感興趣的朋友跟隨小編一起看看吧
    2020-05-05
  • Qt實現(xiàn)Flappy Bird游戲

    Qt實現(xiàn)Flappy Bird游戲

    這篇文章主要為大家詳細介紹了Qt實現(xiàn)Flappy Bird游戲,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • vscode工程中c_cpp_properties.json文件作用詳細說明

    vscode工程中c_cpp_properties.json文件作用詳細說明

    c_cpp_properties.json是Visual Studio Code的一個配置文件,用于定義C/C++編譯器的路徑、默認包含路徑和預處理器定義,這篇文章主要給大家介紹了關于vscode工程中c_cpp_properties.json文件作用詳細說明的相關資料,需要的朋友可以參考下
    2024-08-08
  • C++使用遞歸和非遞歸算法實現(xiàn)的二叉樹葉子節(jié)點個數(shù)計算方法

    C++使用遞歸和非遞歸算法實現(xiàn)的二叉樹葉子節(jié)點個數(shù)計算方法

    這篇文章主要介紹了C++使用遞歸和非遞歸算法實現(xiàn)的二叉樹葉子節(jié)點個數(shù)計算方法,涉及C++二叉樹的定義、遍歷、統(tǒng)計相關操作技巧,需要的朋友可以參考下
    2017-05-05
  • 深入ORACLE變量的定義與使用的詳解

    深入ORACLE變量的定義與使用的詳解

    本篇文章是對ORACLE變量的定義與使用進行了詳細的分析與介紹,需要的朋友參考下
    2013-05-05
  • C++函數(shù)指針與指針函數(shù)有哪些關系和區(qū)別

    C++函數(shù)指針與指針函數(shù)有哪些關系和區(qū)別

    函數(shù)指針是一個指針變量,它可以存儲函數(shù)的地址,然后使用函數(shù)指針,這篇文章主要介紹了C++中函數(shù)指針與指針函數(shù)有哪些關系和區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值
    2022-08-08

最新評論

清流县| 克拉玛依市| 交口县| 崇信县| 尚志市| 从化市| 晋中市| 陈巴尔虎旗| 阳朔县| 顺义区| 射阳县| 西丰县| 阿拉善右旗| 葫芦岛市| 四川省| 湘潭市| 五原县| 探索| 会宁县| 奉贤区| 阿城市| 鸡泽县| 定远县| 六安市| 连山| 红安县| 平南县| 平乐县| 江门市| 余江县| 敦煌市| 东宁县| 南川市| 舒兰市| 榕江县| 西畴县| 扎鲁特旗| 延长县| 阿荣旗| 利辛县| 仁化县|