精华内容
下载资源
问答
  • 效果图如下: 变换前: 变换后: 代码如下: struct object_rect { int x; int y; int width; int height; }; int resize_uniform(Mat &src, Mat &... int dst_w = dst_size.widt

    效果图如下:

    变换前:

    变换后:

    代码如下:

    struct object_rect {
    	int x;
    	int y;
    	int width;
    	int height;
    };
    
    int resize_uniform(Mat &src, Mat &dst, Size dst_size, object_rect &effect_area)
    {
    	int w = src.cols;
    	int h = src.rows;
    	int dst_w = dst_size.width;
    	int dst_h = dst_size.height;
    	std::cout << "src: (" << h << ", " << w << ")" << std::endl;
    	dst = Mat(Size(dst_w, dst_h), CV_8UC1, Scalar(1));
    
    	float ratio_src = w*1.0 / h;
    	float ratio_dst = dst_w*1.0 / dst_h;
    
    	int tmp_w = 0;
    	int tmp_h = 0;
    	if (ratio_src > ratio_dst) {
    		tmp_w = dst_w;
    		tmp_h = floor((dst_w*1.0 / w) * h);
    	}
    	else if (ratio_src < ratio_dst) {
    		tmp_h = dst_h;
    		tmp_w = floor((dst_h*1.0 / h) * w);
    	}
    	else {
    		resize(src, dst, dst_size);
    		effect_area.x = 0;
    		effect_area.y = 0;
    		effect_area.width = dst_w;
    		effect_area.height = dst_h;
    		return 0;
    	}
    
    	std::cout << "tmp: (" << tmp_h << ", " << tmp_w << ")" << std::endl;
    	Mat tmp;
    	resize(src, tmp, Size(tmp_w, tmp_h));
    	tmp.convertTo(tmp,CV_8UC1);
    	
    	if (tmp_w != dst_w) { //高对齐,宽没对齐
    		int index_w = floor((dst_w - tmp_w) / 2.0);
    		std::cout << "index_w: " << index_w << std::endl;
    		for (int i = 0; i<dst_h; i++) {
    			memcpy(dst.data + i*dst_w + index_w, tmp.data + i*tmp_w, tmp_w);
    		}
    		effect_area.x = index_w;
    		effect_area.y = 0;
    		effect_area.width = tmp_w;
    		effect_area.height = tmp_h;
    	}
    	else if (tmp_h != dst_h) { //宽对齐, 高没有对齐
    		int index_h = floor((dst_h - tmp_h) / 2.0);
    		std::cout << "index_h: " << index_h << std::endl;
    		memcpy(dst.data + index_h*dst_w, tmp.data, tmp_w*tmp_h);
    		effect_area.x = 0;
    		effect_area.y = index_h;
    		effect_area.width = tmp_w;
    		effect_area.height = tmp_h;
    	}
    	else {
    		printf("error\n");
    	}
    	return 0;
    }
    
    void main()
    {
       ....
       //OriMat 为图一的mat格式数据
    
       int nSmallWidth = width / 4.0*3.0;
       int nSmallHeight = height / 4.0*3.0;
       Mat dst;
       object_rect res_area;
    		
      (void)resize_uniform(OriMat, dst, Size(nSmallWidth, nSmallHeight), res_area);
    
      SmallSlicebwMatrix.resize(nSmallHeight, nSmallWidth);//习惯使用eigen出来矩阵,所以转换成 
                                                        //    eigen 格式的矩阵
      cv2eigen(dst, SmallSlicebwMatrix);
    
      OriSlicebwMatrix.setOnes();
      int nWidthBeg = (width - nSmallWidth)*1.0 / 2.0;
      int nHeightBeg = (height - nSmallHeight)*1.0 / 2.0;
      for (int i = 0; i < nSmallHeight; i++)
      {
    	 for (int j = 0; j < nSmallWidth; j++)
    	{
    		OriSlicebwMatrix(i + nHeightBeg, j + nWidthBeg) = SmallSlicebwMatrix(i, j); 
           //OriSlicebwMatrix  即为图2
    	}
    }
    
    }

     

    展开全文
  • Opencv 图像等比例缩放

    2020-12-02 21:28:26
    例如Certernet中的缩放就是使用了等比例缩放,周围填充0的操作。 我们来分析下实现原理和实际效果 如上图所示,是将[600,543的图片]等比例缩放为[352,352],边界填充黑色。这样做的好处,是图片不会有变形压缩,使得...

    在神经网络训练过程中,会使用到大量的数据预处理操作。而缩放操作就是这里面最基础。例如Certernet中的缩放就是使用了等比例缩放,周围填充0的操作。

    我们来分析下实现原理和实际效果

    在这里插入图片描述
    如上图所示,是将[600,543的图片]等比例缩放为[352,352],边界填充黑色。这样做的好处,是图片不会有变形压缩,使得训练的时候网络输入的图片,更解决与现实中的图像。

    实际场景中,图片的变形压缩并不影响图像的检查效果; 这种压缩方式的目的主要是为了在设备端实现推理时,与训练时保持预处理的一致,提高检出率。

    warpAffine

    以上效果的实现,是通过cv2.warpAffine方法实现的。该方法的参数为

    cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) → dst
    

    src - 输入图像。
    M - 变换矩阵。
    dsize - 输出图像的大小。
    flags - 插值方法的组合(int 类型!)
    borderMode - 边界像素模式(int 类型!)
    borderValue - (重点!)边界填充值; 默认情况下,它为0。

    在这里,我们需要重点获取M变换矩阵

    getAffineTransform

    变换矩阵是通过

    cv2.getAffineTransform(np.float32(dst), np.float32(src))
    

    src - 输入图像的三个坐标点
    dst - 目标图像的三个坐标点

    我们看下等比例缩放时,输入图形的三个坐标点和输出图像的三个坐标点的计算公式

    在这里插入图片描述
    其中,在原图中

    //图像中心点
    src_cen = (src_w/2, src_h/2)
    max_src_cen = max(src_w/2, src_h/2)
    a0 = (src_cen.x,src_cen.y)
    a1 = (src_cen.x,src_cen.y-max_src_cen)
    a2 = (src_cen.x-max_src_cen, src_cen.y)
    

    同理,目标图像中:

    //图像中心点
    dst_cen = (dst_w/2, dst_h/2)
    max_det_cen = max(dst_w/2, dst_h/2)
    a0 = (dst_cen.x,dst_cen.y)
    a1 = (dst_cen.x,dst_cen.y-max_det_cen)
    a2 = (dst_cen.x-max_det_cen, dst_cen.y)
    

    三个点的相对位置的宽和高分别与图形的宽和高对应,也就是将三个坐标点的空间关系与图像的宽和高进行绑定,以此达到使用getAffineTransform的时候,能够等比例缩放图片

    源码

    以下是c++的实现,python的实现,可以参考centernet工程centernet

    #include <opencv2\opencv.hpp>
    
    struct CenterScale
    {
    	cv::Mat input;
    	cv::Point2f center;
    	cv::Point2f scale;
    	float r = 0;
    };
    
    cv::Point2f get_dir(cv::Point2f src_point, float rot_rad)
    {
    	float sn = sin(rot_rad);
    	float cs = cos(rot_rad);
    	float src_result[2] = { 0, 0 };
    	src_result[0] = src_point.x * cs - src_point.y * sn;
    	src_result[1] = src_point.x * sn + src_point.y * cs;
    	return{ src_result[0], src_result[1] };
    }
    cv::Mat  get_affine_transform(cv::Point2f center, cv::Point2f scale, float rot,
    	int output_size[], bool inv)
    {
    	float scale_tmp = scale.x;
    	float src_w = scale_tmp;
    	float dst_w = (float)output_size[0];
    	float dst_h = (float)output_size[1];
    
    
    	float half_1 = 0.5;
    	float shift[2] = { 0, 0 };
    	float rot_rad = 3.1415926 * rot / 180;
    	cv::Point2f src_point = { 0, src_w * -half_1 };
    
    	cv::Point2f src_dir = get_dir(src_point, rot_rad);
    
    	cv::Point2f dst_dir = { 0, dst_w * -half_1 };
    
    	cv::Point2f src[3];
    	cv::Point2f dst[3];
    
    	src[0] = { center.x + scale_tmp * shift[0], center.y + scale_tmp * shift[1] };
    	src[1] = { center.x + src_dir.x + scale_tmp * shift[0], center.y + src_dir.y + scale_tmp * shift[1] };
    
    	dst[0] = { dst_w * half_1, dst_h * half_1 };
    	dst[1] = { dst_w * half_1 + dst_dir.x, dst_h * half_1 + dst_dir.y };
    
    	src[2] = get_3rd_point(src[0], src[1]);
    	dst[2] = get_3rd_point(dst[0], dst[1]);
    
    	cv::Mat trans;
    	if (inv)
    	{
    		trans = cv::getAffineTransform(dst, src);
    	}
    	else
    	{
    		trans = cv::getAffineTransform(src, dst);
    	}
    	return trans;
    }
    
    
    CenterScale getAffineTransImage(const cv::Mat& img, int network_input_size[])
    {
    
    	int width = img.cols;
    	int height = img.rows;
    
    	CenterScale center_scale;
    	center_scale.center = { width / (float)2.0, height / (float)2.0 };
    	float s = std::max(height, width)*1.0;
    	center_scale.scale = { s, s };
    
    	float rolate = 0;
    
    	cv::Mat trans = get_affine_transform(center_scale.center, center_scale.scale, rolate, network_input_size, false);
    
    	cv::Mat transed_dstImage(network_input_size[0], network_input_size[1], img.type());
    	cv::warpAffine(img, transed_dstImage, trans, transed_dstImage.size());
    
    
    	CenterScale meta;
    	meta.input = transed_dstImage;
    	meta.center = center_scale.center;
    	meta.scale = center_scale.scale;
    	meta.r = 0.0;
    	return meta;
    
    }
    cv::Point2f get_3rd_point(cv::Point2f a, cv::Point2f b)
    {
    	cv::Point2f direct = { a.x - b.x, a.y - b.y };
    	direct = { b.x - direct.y, b.y + direct.x };
    	return direct;
    }
    int main()
    
    {
    	cv::Mat input = cv::imread("G://VS2013//Ai_Demo//images//person.jpg"); 
    	int network_input_size[2] = { 352, 352 };
    	CenterScale meta = getAffineTransImage(input, network_input_size);
    	cv::imwrite(meta.input);
    	return 0;
    
    }
    
    展开全文
  • 等比例缩放图片-opencv

    2021-07-10 12:05:52
    如果dw 和 dh 有值,则缩放成为dw或者dh 为最终值的图片,fix_type中msrc为源图,mdest为需要生成的图 typedef enum fix_enum { enum_x_fix, enum_y_fix, enum_xy_fix }fix_enum; typedef struct fix_type { //...

    数据结构定义

    如果dw 和 dh 有值,则缩放成为dw或者dh 为最终值的图片,fix_type中msrc为源图,mdest为需要生成的图
    typedef enum fix_enum
    {
       enum_x_fix,
       enum_y_fix,
       enum_xy_fix
    }fix_enum;
    
    typedef struct fix_type
    {
    	//int sw;
    	//int sh;
    	int dw;
    	int dh;
    	fix_enum fix;
    //	string dest;
    	Mat msrc;
    	Mat mdest;
    }fix_type;
    

    等比例缩放函数

    算法如下:
    //1 指定x宽度,y成比例
    //2 制定y高度,x成比例
    
    String get_dest(String &srcImage,fix_type &ftype) {
    	
    	size_t t = srcImage.find_last_of(".");
    	String destfile = srcImage.substr(0, t);
    	String after = srcImage.substr(t, srcImage.length() - t);
    
    	double scale = 1.0f;
    	int width  = ftype.msrc.cols;
    	int height = ftype.msrc.rows;
    
    	int ddw = 0;
    	int ddh = 0;
    	switch (ftype.fix) 
    	{
    	case enum_x_fix: //width 宽度,y成比例
    		scale = (float)ftype.dw / (float)width ;
    		ddw = width*scale;
    		ddh = height*scale;
    		break;
    	case enum_y_fix:
    		scale = (double)ftype.dh / (double)height;
    		ddw = width *scale;
    		ddh = width *scale;
    		break;
    	case enum_xy_fix:
    		ddw = ftype.dw;
    		ddh = ftype.dh;
    		break;
    	}
    	stringstream s;
    	s<< destfile;
    	s << "_thumb_";
    	s << ddw << "_" << ddh << after;
    	//destfile = destfile+  "_thumb_"+ itoa(ddw + ddh + after;
    
    	//Size S = Size(width*scale, height*scale);
    	Size S = Size(ddw, ddh);
    	cv::resize(ftype.msrc, ftype.mdest, S, 0, 0);
    
    	//cvNamedWindow("test", CV_WINDOW_AUTOSIZE);
    	//imshow("test", ftype.mdest);
    	//cvWaitKey(0);
    	return s.str();
    }
    

    效果

    缩小

    填入参数
    参数配置

    生成缩略图

    放大

    放大

    show me the code 完整代码

    #define _CRT_SECURE_NO_DEPRECATE
    #include <opencv2\opencv.hpp>
    #include <stdio.h>
    //#include <time.h>
    #include <string>
    //using namespace tinyxml2;
    using namespace cv;
    using namespace std;
    
    #ifndef _DEBUG
    #pragma comment(lib,"opencv_world440.lib")
    #else
    #pragma comment(lib,"opencv_world440d.lib")
    #endif
    #define MAX_PATH 260
    
    typedef enum fix_enum
    {
       enum_x_fix,
       enum_y_fix,
       enum_xy_fix
    }fix_enum;
    
    typedef struct fix_type
    {
    	//int sw;
    	//int sh;
    	int dw;
    	int dh;
    	fix_enum fix;
    //	string dest;
    	Mat msrc;
    	Mat mdest;
    }fix_type;
    
    const String keys =
    "{ help  | false | print usage         }"
    "{ image   | dog.jpg | path to image file }"
    "{ width   | 0   | image to width  }"
    "{ height  | 0   | image to height }"
    ;
    
    
    //1 指定x宽度,y成比例
    //2 制定y高度,x成比例
    
    String get_dest(String &srcImage,fix_type &ftype) {
    	
    	size_t t = srcImage.find_last_of(".");
    	String destfile = srcImage.substr(0, t);
    	String after = srcImage.substr(t, srcImage.length() - t);
    
    	double scale = 1.0f;
    	int width  = ftype.msrc.cols;
    	int height = ftype.msrc.rows;
    
    	int ddw = 0;
    	int ddh = 0;
    	switch (ftype.fix) 
    	{
    	case enum_x_fix: //width 宽度,y成比例
    		scale = (float)ftype.dw / (float)width ;
    		ddw = width*scale;
    		ddh = height*scale;
    		break;
    	case enum_y_fix:
    		scale = (double)ftype.dh / (double)height;
    		ddw = width *scale;
    		ddh = width *scale;
    		break;
    	case enum_xy_fix:
    		ddw = ftype.dw;
    		ddh = ftype.dh;
    		break;
    	}
    	stringstream s;
    	s<< destfile;
    	s << "_thumb_";
    	s << ddw << "_" << ddh << after;
    	//destfile = destfile+  "_thumb_"+ itoa(ddw + ddh + after;
    
    	//Size S = Size(width*scale, height*scale);
    	Size S = Size(ddw, ddh);
    	cv::resize(ftype.msrc, ftype.mdest, S, 0, 0);
    
    	//cvNamedWindow("test", CV_WINDOW_AUTOSIZE);
    	//imshow("test", ftype.mdest);
    	//cvWaitKey(0);
    	return s.str();
    }
    
    
    
    int main(int argc, char** argv) {
    
    	CommandLineParser parser(argc, argv, keys);
    	String srcImage = parser.get<String>("image");
    	string type = "";
    	string dest;
    	
    	fix_type fixtype;
    	fixtype.fix = enum_x_fix;
    	fixtype.msrc = imread(srcImage);
    
    	if (fixtype.msrc.empty())
    	{
    		cout << "{\"ret\":-1,\"url\":\"null\"}";
    		return -1;
    	}
    
    	fixtype.dw = parser.get<int>("width");
    	fixtype.dh = parser.get<int>("height");
    	int dw = fixtype.dw;
    	int dh = fixtype.dh;
    	//cout << "dw is " << dw << " " << "dh is " << dh << endl;
    	if ((dw > 0) && (dh == 0))
    		fixtype.fix = enum_x_fix;
    	else if ((dw == 0) && (dh > 0))
    		fixtype.fix = enum_y_fix;
    	else if ((dw > 0) && (dh > 0))
    		fixtype.fix = enum_xy_fix;
    	else {
    		fixtype.dw = 100;
    		fixtype.dh = 0;
    		fixtype.fix = enum_x_fix;
    	}
    	
    
    	//std::cout << fixtype.msrc.rows << " " << fixtype.msrc.cols << endl;
    	String file = get_dest(srcImage,fixtype);
    	imwrite(file, fixtype.mdest);
    	imshow("ori", fixtype.msrc);
    	imshow("tra", fixtype.mdest);
    	cv::waitKey(0);
    	cout << "{\"ret\":1,\"url\":\"" + file + "\"}";
    	return 0;
    	}
    
    展开全文
  • 函数:cv2.resize() 说明:缩放就是改变图片的大小,这个函数改变图片的长和宽,或者按一定比例进行变化。简单例子:代码如下:import cv2#导入图片img = cv2.imread('1.png')a0 = img#缩小0.5倍a1 = cv2.resize(img,...

    函数:cv2.resize()
    说明:缩放就是改变图片的大小,这个函数改变图片的长和宽,或者按一定比例进行变化。

    简单例子:

    代码如下:

    import cv2#导入图片img = cv2.imread('1.png')a0 = img#缩小0.5倍a1 = cv2.resize(img,None,fx=0.5, fy=0.5, interpolation = cv2.INTER_CUBIC)#放大2倍a2 = cv2.resize(img,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC)#放大5倍a3 = cv2.resize(img,None,fx=5, fy=5, interpolation = cv2.INTER_CUBIC)#放大10倍a4 = cv2.resize(img,None,fx=10, fy=10, interpolation = cv2.INTER_CUBIC)#图片展示cv2.imshow('a0',a0)cv2.imshow('a1',a1)cv2.imshow('a2',a2)cv2.imshow('a3',a3)cv2.imshow('a4',a4)#关闭所有窗口cv2.waitKey(0)cv2.destroyAllWindows()

    我们先导入图片1(1.png,像素大小41x41)

    a53aba6fb18bba9bad1069aa37ff5ea9.png

    原图

    经过缩放后,图片变化如下:

    c52968382f5042925bc069bb207b737b.png

    图中所示,从左到右大小变化如下:原图、缩小0.5倍,放大2倍,放大5倍,放大10倍

    详解:

    cv2.resize(img,None,fx=0.5, fy=0.5, interpolation = cv2.INTER_CUBIC)

    img为导入图片,fx=0.5和 fy=0.5表示缩放0.5倍,cv2.INTER_CUBIC是所采用的方法。

    缩放有三种方法:cv2.INTER_AREA 、cv2.INTER_CUBIC 、cv2.INTER_LINEAR
    方法不同,效果不同,效果从左到右展示如下:

    5fb0ef38df22e4ec556b0077667ebc88.png

    cv2.INTER_AREA 、cv2.INTER_CUBIC 、cv2.INTER_LINEAR

    如果函数这样表示,cv2.resize(img,None,fx=0.5, fy=0.5),系统默认方法为 cv2.INTER_LINEAR。

    喜欢可以点赞,谢谢大家!

    展开全文
  • @File : 200113_等比例调整图像分辨率大小.py @Time : 2020/1/13 13:38 @Author : Dontla @Email : sxana@qq.com @Software: PyCharm """ import cv2 def img_resize(image): heigh...
  • 基于OpenCV实现的双线性插值缩放图像,缩放效果与OpenCV自带的resize的结果一致
  • Java OpenCV剪裁图片,等比例缩放图片

    千次阅读 2018-03-20 17:01:49
    最近完成一个项目,需要用到opencv但是网上关于opencv的java文章特别的少。一边摸索一般实现一个个小的功能。package cn.edu.xiyou.hikvision; import org.opencv.core.Core; import org.opencv.core.Mat; import ...
  • 使用Python和OpenCV进行图像缩放操作。 Part1:按照尺寸进行缩放 #!/usr/bin/env python # coding: utf-8 # In[10]: #(Python+OpenCV)图像缩放 # In[11]: import sys import cv2 as cv import numpy as ...
  • OpenCV 图片尺寸缩放

    2016-08-30 20:12:30
    实验描述用OpenCV进行图片尺寸的缩放。二. 实验代码//图片尺寸缩放 class Task15 { public: void deal() { Mat src_img = imread("img\\3.jpg"); imshow("图片尺寸缩放[原图]", src_img); Mat out1 = Mat::zeros...
  • 主要介绍了Python OpenCV之图片缩放的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • opencv: 图像缩放(cv2.resize)

    万次阅读 多人点赞 2017-10-12 19:43:02
    Syntax cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) → dst ... 但是当图像缩放时,它类似于INTER_NEAREST方法。...缩放后的图像: ...opencv: cv2.resize 探究(源码) 。
  • OpenCV】图像缩放

    千次阅读 2020-08-28 21:10:21
    1、内置函数resize: void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR ) ...double fx=0 -在x轴上的缩放比例 double fy=0
  • opencv图像窗口缩放

    千次阅读 2019-05-27 11:09:08
    总结在opencv中,图片显示的问题。简要解决图片窗口和图片大小的问题。 namedWindow(“窗口名”,1);//创建窗口 imshow(“窗口名”,要显示的图片);//在创建的窗口中显示图片 官网中内容,默认情况下,是1,自动调整...
  • OpenCV实现图片缩放

    万次阅读 2018-10-12 15:47:08
    OpenCV系列教程》 项目位置: OpenCV-Sample ... 但是当图像缩放时,它类似于INTER_NEAREST方法。 INTER_CUBIC 4x4像素邻域的双三次插值 INTER_LANCZOS4 8x8像素邻域的Lanczos插值
  • opencv2等比缩放图片

    千次阅读 2019-05-17 17:12:03
    本代码缩放图片后图片清晰的保持不变 前提必须有opencv_world343的dll和lib库,版本随意选,一般安装的opencv软件只有64位的库,这是最操蛋的地方 #include <WINDOWS.H> #include "opencv2/imgproc/imgproc...
  • opencv-图像缩放resize()

    2019-06-26 18:19:16
    运行环境: ...vs2013、opencv3.3、win10-64bit OpenCV提供了resize()函数来改变图像的大小。 函数原型: void resize( InputArray src, OutputArray dst, Size dsize, double fx=0, ...
  • opencv入门:缩放,翻转,仿射,透视,重映射
  • #1 load 2 info 3 resize 4 check import cv2 img = cv2.imread('bucky.jpg',1) imgInfo = img.shape print(imgInfo) height = imgInfo[0] width = imgInfo[1] ...#1 放大 缩小 2等比例 非 dstHeight = in...
  • 放大 缩小 等比例缩放 dstHeight = int(height*0.5) dstWidth = int(width*0.5) # 最近零域插值 双线性插值 像素关系重采样 立方插值 dst = cv2.resize(img,(dstHeight,dstWidth)) cv2.imshow('image',dst) cv2....
  • 有时候直接进行resize会有形变,所以想到这样的方式,同比例缩放,然后补0。torchvision中是用的PIL。在推理时需要用opencv。 2.实现 参考:https://blog.csdn.net/u010397980/article/details/84889093 def ...
  • opencv-图像缩放

    千次阅读 2013-07-28 11:25:58
    OpenCV代码:scale是放缩比例 #include "stdafx.h" #include #include #include #include using namespace std; using namespace cv; int main(int argc ,char ** argv) { IplImage *scr=0; ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,222
精华内容 2,488
关键字:

opencv等比例缩放