通过opencv实现图像的旋转、缩放

这篇具有很好参考价值的文章主要介绍了通过opencv实现图像的旋转、缩放。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

用opencv来实现图像的旋转与缩放,代码如下:

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


/*** (1). implementing Bilinear Interpolation ***/
bool BilinearInterpolation(
    IplImage* pSrcImg,   //@pSrcImg : input gray image
    IplImage* &pDstImg,  //@pDstImg : output scaled gray image
    float horScale = 1., //@horScale: transformation scale in horizontal direction
    float verScale = 1.) //@verScale: transformation scale in vertical direction
{
    if (!pSrcImg || horScale <= 0 || verScale <= 0)
        return false;

    /*** YOUR CODE HERE ***///50pts
    int src_width = pSrcImg->width;
    int src_height = pSrcImg->height;
    float dst_width = src_width / horScale;
    float dst_height = src_height / verScale;
    pDstImg = cvCreateImage(cvSize(dst_width, dst_height), pSrcImg->depth, pSrcImg->nChannels);
    int src_step = pSrcImg->widthStep;   //源存储图像一行字节数
    int dst_step = pDstImg->widthStep;   //目标存储图像一行字节数
    unsigned char* src_data = (unsigned char*)pSrcImg->imageData;   //源图像数据指针
    unsigned char* dst_data = (unsigned char*)pDstImg->imageData;   //目标图像数据指针


    int i, i1, j, j1;
    double u, u1, v, v1;


    for (int y = 0; y < dst_height; y++){

        float srcy1 = (float)(( y + 0.5 ) * verScale - 0.5);   //对应原图像的每一个y1
        j = (int)srcy1;
        if (j == src_height){ //对应原图像的最后一个y2
            j1 = j;
        }
        else {
            j1 = j + 1;//对应原图像的每一个y2
        }
        v = double(srcy1) - j;
        v1 = 1.0f- v;  


        for (int x = 0; x < dst_width; x++){
            float srcx1 = (float)(( x + 0.5 ) * horScale - 0.5);     //对应原图像的每一个x1
            i = (int)srcx1;
            if (i == src_width){
                i1 = i;     //对应原图像的最后一个x2
            }
        else {
                i1 = i + 1; //对应原图像的每一个x2
            }
            u = double(srcx1) - i; 
            u1 = 1.0f - u;    
            double result = 0;
            result = (u1 * v1) * src_data[j * src_step + i] + (u1 * v) * src_data[j1 * src_step + i] +  (u * v1) * src_data[j * src_step + i1]+ (u * v) * src_data[j1 * src_step + i1] ;
            dst_data[y * dst_step + x] = (int)result;

        }
    }

    return true;
}

/*** (2). implementing image Rotation ***/

bool ImageRotation(
    IplImage* pSrcImg,  //@pSrcImg: input gray image
    IplImage*& pDstImg,  //@pDstImg: output rotated gray image
    float angle = 45)   //@angle  : rotated angle
{
    if (!pSrcImg || angle < 0 || angle >= 360)
        return false;

    /*** YOUR CODE HERE ***///50pts
    angle = -angle;
    double radian = (float)(angle / 180.0 * CV_PI);
    double a = sin(radian), b = cos(radian);
    int width = pSrcImg->width;
    int height = pSrcImg->height;
    int width_rotate = int(height * fabs(a) + width * fabs(b));
    int height_rotate = int(width * fabs(a) + height * fabs(b));
    //旋转数组map
    float map[6];
    Mat map_matrix = Mat(2, 3, CV_32F, map);
    // 旋转中心
    CvPoint2D32f center = cvPoint2D32f(width / 2, height / 2);
    CvMat map_matrix2 = map_matrix;
    cv2DRotationMatrix(center, angle, 1.0, &map_matrix2);
    map[2] += (width_rotate - width) / 2;
    map[5] += (height_rotate - height) / 2;
    Mat DstImg;
    //对图像做仿射变换
    Mat SrcImg = cvarrToMat(pSrcImg);
    warpAffine(SrcImg, DstImg, map_matrix, Size(width_rotate, height_rotate),1,0,0);
    pDstImg = cvCloneImage(&IplImage(DstImg));
}
void main()
{
    IplImage* pSrcImg = cvLoadImage("bicycle.bmp", 0);
    IplImage* pDstImg = NULL;

    cvNamedWindow("src");
    cvShowImage("src", pSrcImg);

    //*** Demo of bilinear interpolation ***/
    BilinearInterpolation(pSrcImg, pDstImg, 0.5, 0.5);
    cvNamedWindow("scaleing");
    cvShowImage("scaleing", pDstImg);
    cvSaveImage("Bilinear.jpg", pDstImg);
    cvWaitKey(0);
    cvReleaseImage(&pDstImg);
    pDstImg = NULL;
    /*** Demo of image rotation ***/
    ImageRotation(pSrcImg, pDstImg, 60);
    cvNamedWindow("rotation");
    cvShowImage("rotation", pDstImg);
    cvSaveImage("Rotation.jpg", pDstImg);
    cvWaitKey(0);

    cvReleaseImage(&pSrcImg);
    cvReleaseImage(&pDstImg);
    cvDestroyAllWindows();
    return;
    
}文章来源地址https://www.toymoban.com/news/detail-836610.html

到了这里,关于通过opencv实现图像的旋转、缩放的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python实现两函数通过缩放,平移和旋转进行完美拟合

    前几天在工作的时候接到了一个需求,希望将不同坐标系,不同角度的两条不规则曲线,并且组成该曲线的点集数量不一致,需求是希望那个可以通过算法的平移和旋转搞到一个概念里最贴合,拟合态进行比较。 这是初步将两组数据画到图里的情况,和背景需求是一致的。其

    2024年02月15日
    浏览(36)
  • Halcon用矩阵实现图像变换(平移,旋转,缩放,镜像等)

    目录 图像变换介绍  用Halcon自带的算子实现图像变换 使用矩阵来实现相关算子的功能 一、平移 二、旋转 三、缩放 四、镜像 完整代码         在halcon中经常会用到图像变换的操作,然后这次作业是用矩阵来实现相关算子的功能,学到了挺多的所以就记录下来方便复习。

    2024年04月17日
    浏览(41)
  • 【C++】【Opencv】cv::warpAffine()仿射变换函数详解,实现平移、缩放和旋转等功能

    仿射变换是一种二维变换,它可以将一个二维图形映射到另一个二维图形上,保持了图形的“形状”和“大小”不变,但可能会改变图形的方向和位置。仿射变换可以用一个线性变换矩阵来表示,该矩阵包含了六个参数,可以进行平移、缩放、旋转等操作。通过原理、函数和

    2024年02月05日
    浏览(62)
  • Python OpenCV 图像旋转:实现图像的随意旋转

    Python OpenCV 图像旋转:实现图像的随意旋转 在数字图像处理中,图像旋转是常见的一种图像几何变换操作。利用图像旋转,我们可以将图片进行任意角度的旋转,并且保持图像内容不失真。Python 中的 OpenCV 库提供了丰富的图像处理 API,包括了图像旋转操作。本文将介绍利用

    2024年02月12日
    浏览(42)
  • pygame图像变换:缩放、旋转、镜像

    pygame的transform中封装了一些基础的图像处理函数,列表如下 函数 功能 flip 镜像 scale 缩放至新的分辨率 scale_by 根据因子进行缩放 scale2x 专业图像倍增器 rotate 旋转 rotozoom 缩放并旋转 smoothscale 平滑缩放 smoothscale_by 平滑缩放至新的分辨率 chop 获取已删除内部区域的图像的副本

    2024年02月04日
    浏览(38)
  • Matlab图像的平移,旋转,缩放,裁剪

    %%------------------------Matlab图像的平移,旋转,缩放,裁剪------------------------------- %-------------------头文件----------------------------- clc ; %清屏幕 clear ; %删除所有的变量 close all ; %将所有打开的图片关掉 %--------------------图像平移 imtranslate-------------------------- A = imread(\\\'1.jpg\\\') ; subplot(

    2024年02月04日
    浏览(45)
  • Python图像处理丨图像缩放、旋转、翻转与图像平移

    摘要: 本篇文章主要讲解Python调用OpenCV实现图像位移操作、旋转和翻转效果,包括四部分知识:图像缩放、图像旋转、图像翻转、图像平移。 本文分享自华为云社区《[Python图像处理] 六.图像缩放、图像旋转、图像翻转与图像平移》,作者:eastmount 。 本篇文章主要讲解Pyth

    2024年02月06日
    浏览(56)
  • OpenCV中的图像旋转和翻转如何实现?

    在OpenCV中,可以使用函数来实现图像的旋转和翻转。下面是一种常用的方法: 图像旋转: 图像旋转可以通过函数 cv2.warpAffine() 来实现。这个函数可以根据指定的旋转角度、旋转中心和图像尺寸来进行图像的旋转。 示例代码: 图像翻转: 图像翻转可以通过函数 cv2.flip() 来实

    2024年02月13日
    浏览(46)
  • Unity 通过键盘鼠标控制物体移动、旋转、缩放的方法

    在Unity中,使用键盘ADWS键控制物体移动,通过鼠标左键控制物体旋转,鼠标中键控制物体缩放是再常见不过的方法。 方法如下:  效果如下:Unity 通过键盘鼠标控制物体移动、旋转、缩放_哔哩哔哩_bilibili

    2024年02月03日
    浏览(51)
  • 基于WPF Opencv实现一个图像可移动、缩放和可交互的显示窗口

    学习Halcon的HSmartWindowControl窗口控件,用WPF和Opencv仿照了一个。 显示控件的主体是两个Canvas: Root Canvas是背景,刷上了网格; 把要显示的图像作为Image Canvas的图像背景, 后面图像的移动,缩放,实质都是Image Canvas。 可交互,学习的是Halcon的绘图对象,WPF的Path来实现的,Path类

    2023年04月09日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包