iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >opencv实现图像倾斜校正
  • 808
分享到

opencv实现图像倾斜校正

opencv图像倾斜校正opencv图像校正opencv倾斜校正 2022-11-13 13:11:27 808人浏览 八月长安
摘要

本文实例为大家分享了OpenCV实现图像倾斜校正的具体代码,供大家参考,具体内容如下 今天的任务是如图这两种情况,我现在的情况是和如图一样的,左图左边倾斜一点儿,那么我需要把左边压

本文实例为大家分享了OpenCV实现图像倾斜校正的具体代码,供大家参考,具体内容如下

今天的任务是如图这两种情况,我现在的情况是和如图一样的,左图左边倾斜一点儿,那么我需要把左边压低倾斜校正。右图,右边倾斜我需要把右边下压到水平位置倾斜校正。我的场景不会有大角度的倾斜,就这么点可能的不会超过45°的小角度。
标准的传统图像处理方法。首先就是灰度,二值化,取轮廓,筛选得到目标(面积最大的那个),得到倾斜角度,转正。
具体过程就不详细说了,都在代码里面一看就懂。效果图如下:

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: opencv实现图像倾斜校正

本文链接: https://www.lsjlt.com/news/171261.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • opencv实现图像倾斜校正
    本文实例为大家分享了opencv实现图像倾斜校正的具体代码,供大家参考,具体内容如下 今天的任务是如图这两种情况,我现在的情况是和如图一样的,左图左边倾斜一点儿,那么我需要把左边压...
    99+
    2022-11-13
    opencv图像倾斜校正 opencv图像校正 opencv倾斜校正
  • OpenCV实现倾斜文字校正
    基于OpenCV的倾斜文字校正,供大家参考,具体内容如下 使用OpenCV里example中的的倾斜文本作为输入,本文的目的即将该倾斜的文本校正成水平方向的文本。 主要思路为: 读取...
    99+
    2022-11-13
    OpenCV倾斜文字校正 OpenCV倾斜校正 OpenCV文字校正
  • python中opencv实现图片文本倾斜校正
    本项目为python项目需要安装python及python的opencv模块:opencv_python-4.0.1-cp37-cp37m-win32.whl 和 python的矩阵...
    99+
    2022-11-12
  • Opencv实现倾斜图片转正示例
    今天是我们来玩一个钉子。通过一个钉子来学习一个opencv中的一个函数,这个函数我网上也有搜过,不过遗憾的是,各路好手都是写的是有点不堪入目,现在这个学习氛围是越来越差了,很多人都直...
    99+
    2022-11-11
  • opencv实现图像校正
    本文实例为大家分享了opencv实现图像校正的具体代码,供大家参考,具体内容如下 1.引言:python实现倾斜图像校正操作 2.思路流程: (1)读入,灰度化;(2)高斯模糊;(3...
    99+
    2022-11-11
  • opencv+python实现图像矫正
    本文实例为大家分享了opencv+python实现图像矫正的具体代码,供大家参考,具体内容如下 需求:将斜着拍摄的文本图像进行矫正 python代码 import numpy as ...
    99+
    2022-11-11
  • OpenCV实现相机校正
    本文实例为大家分享了OpenCV实现相机校正的具体代码,供大家参考,具体内容如下 1. 相机标定 根据张正友校正算法,利用棋盘格数据校正对车载相机进行校正,计算其内参矩阵,外参矩阵和...
    99+
    2022-11-12
  • 简述Java图像倾斜方法及实例 原创
            可以使用 graphics2D 类提供的 shear() 方法设置绘图的倾斜方向,从而使图像实现倾斜的效果。下面,我们一起来看一下它的使用方法和实例。&n...
    99+
    2023-05-31
    java 图像倾斜 fo
  • OpenCV实现相机校正的方法
    这篇文章主要介绍OpenCV实现相机校正的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体内容如下1. 相机标定根据张正友校正算法,利用棋盘格数据校正对车载相机进行校正,计算其内参矩阵,外参矩阵和畸变系数。标定...
    99+
    2023-06-15
  • C++OpenCV实战之图像透视矫正
    目录前言一、图像预处理二、轮廓提取1.提取最外轮廓2.提取矩形四个角点3.将矩形角点排序三、透视矫正四、源码前言 本文将使用OpenCV C++ 进行图像透视矫正。 一、图像预处理 ...
    99+
    2022-11-12
  • OpenCV实现图像膨胀
    图像的膨胀与图像腐蚀是一对相反的过程,与图像腐蚀相似,图像膨胀同样需要结构元素用于控制图像膨胀的效果。结构元素可以任意指定结构的中心点,并且结构元素的尺寸和具体内容都可以根据需求自己...
    99+
    2022-11-12
  • OpenCV实现图像腐蚀
    图像的腐蚀过程与图像的卷积操作类似,都需要模板矩阵来控制运算的结果,在图像的腐蚀和膨胀中这个模板矩阵被称为结构元素。与图像卷积相同,结构元素可以任意指定图像的中心点,并且结构元素的尺...
    99+
    2022-11-12
  • openCV实现图像分割
    本次实验为大家分享了openCV实现图像分割的具体实现代码,供大家参考,具体内容如下 一.实验目的 进一步理解图像的阈值分割方法和边缘检测方法的原理。 掌握图像基本全局阈值方法和最大...
    99+
    2022-11-12
  • opencv实现图像平移
    本文实例为大家分享了opencv实现图像平移的具体代码,供大家参考,具体内容如下 图像平移指的是沿水平方向或垂直方向进行图像的移动。 平移变换公式: 对于原始图像而言,正变换矩阵:...
    99+
    2022-11-13
    opencv 图像平移
  • css3怎么实现超立体3D图片侧翻倾斜效果
    这篇文章主要讲解了“css3怎么实现超立体3D图片侧翻倾斜效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“css3怎么实现超立体3D图片侧翻倾斜效果”吧!...
    99+
    2022-10-19
  • OpenCV如何通过透视变换实现矫正图像
    这篇“OpenCV如何通过透视变换实现矫正图像”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“OpenCV如何通过透视变换实现...
    99+
    2023-07-05
  • OpenCV怎么通过透视变换实现矫正图像
    这篇“OpenCV怎么通过透视变换实现矫正图像”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“OpenCV怎么通过透视变换实现...
    99+
    2023-07-05
  • OpenCV实现图像连通域
    图像的连通域是指图像中具有相同像素值并且位置相邻的像素组成的区域,连通域分析是指在图像中寻找出彼此互相独立的连通域并将其标记出来。 一般情况下,一个连通域内只包含一个像素值,因此为了...
    99+
    2022-11-12
  • OpenCV 图像绘制的实现
    目录+直线绘制圆形绘制矩形绘制椭圆型绘制自定义形状绘制文本+直线绘制 参数解析:(图像矩阵,直线起始坐标, 直线终止坐标、颜色、线条厚度) import cv2 import n...
    99+
    2022-11-12
  • OpenCV 图像拼接和图像融合的实现
    目录基于SURF的图像拼接1.特征点提取和匹配2.图像配准3. 图像拷贝4.图像融合(去裂缝处理)基于ORB的图像拼接opencv自带的拼接算法stitch1.opencv stit...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作