当前位置: 首页 > news >正文

网站建设 中企动力福州阀门wordpress 多说评论

网站建设 中企动力福州阀门,wordpress 多说评论,郑州网站建设网页设计,网站后台里有网页代码没文章目录 一、仿射变换1. getRotationMatrix2D()2. warpAffine() 二、透射变换三、极坐标变换 一、仿射变换 在OpenCV中没有专门用于图像旋转的函数#xff0c;而是通过图像的仿射变换实现图像的旋转。实现图像的旋转首先需要确定旋转角度和旋转中心#xff0c;之后确定旋转… 文章目录 一、仿射变换1. getRotationMatrix2D()2. warpAffine() 二、透射变换三、极坐标变换 一、仿射变换 在OpenCV中没有专门用于图像旋转的函数而是通过图像的仿射变换实现图像的旋转。实现图像的旋转首先需要确定旋转角度和旋转中心之后确定旋转矩阵最终通过仿射变换实现图像旋转。OpenCV 4提供了getRotationMatrix2D()函数用于计算旋转矩阵和warpAffine()函数用于实现图像的仿射变换 1. getRotationMatrix2D() cv::Mat cv::getRotationMatrix2D(cv::Point2f center, // 旋转中心点坐标。 通常以图像的中心为旋转中心double angle, // 旋转角度正值表示逆时针旋转double scale // 缩放因子。 默认值为1.0表示不进行缩放 );返回值是一个 2x3 的仿射变换矩阵为什么仿射变换矩阵是一个2*3的形式   先看仿射变换的概率仿射变换其实就是图像的旋转、平移和缩放操作的统称可以表示为线性变换和平移变换的叠加。   仿射变换的数学表示是先乘以一个线形变换矩阵再加上一个平移向量即T aX b。但一个二维平面的像素坐标为(x,y)是一个1×2的向量矩阵那公式就变成如下 根据矩阵相乘的规则其中线性变换矩阵A为2×2的矩阵平移向量B为2×1的向量两者结合就是一个2×3的变换矩阵。 2. warpAffine() 1getRotationMatrix2D()是为了得到一个仿射变换矩阵然后通过 cv::warpAffine 函数应用到图像上进行旋转操作如果我们已知图像旋转矩阵可以自己生成旋转矩阵而不调用该函数。 void cv::warpAffine(cv::InputArray src, // 输入图像cv::OutputArray dst, // 输出图像cv::InputArray M, // 2x3 的仿射变换矩阵cv::Size dsize, // 输出图像的尺寸int flags cv::INTER_LINEAR,// 插值方法默认为线性插值int borderMode cv::BORDER_CONSTANT, // 边界填充模式默认为常数填充const cv::Scalar borderValue cv::Scalar() // 边界填充颜色默认为黑色(0,0,0) );注 常用的边界填充模式有 cv::BORDER_CONSTANT常数填充和 cv::BORDER_REPLICATE复制边界像素 边界填充颜色仅当 borderMode 设置为 cv::BORDER_CONSTANT 时有效2在使用 warpAffine() 函数进行旋转时通常保留的是原图大小这会导致目标保存的不完整。可以改变缩放因子来获得完整目标但这会导致目标尺寸变小如下 #include opencv2/opencv.hpp #includeiostream using namespace std;int main() {cv::Mat img cv::imread(C:/Users/Opencv/temp/lena.png, 0);int h img.rows;int w img.cols;// 定义仿射旋转矩阵rMcv::Point2f center(h / 2, w / 2); // 以图像中心为坐标double angle 30; // 设定30的逆时针旋转角度double scale 1.0; // 不进行缩放// double scale 0.5; // 缩放0.5cv::Mat rM cv::getRotationMatrix2D(center, angle, scale);// 进行普通旋转操作保存原图大小cv::Mat rotationImg1, rotationImg2;cv::warpAffine(img, rotationImg1, rM, img.size());3如果想要保持目标大小不变就只能加大输出图片。 红色框是源图像 宽和高分别为 h 和 w黑色框是逆时针旋转 θ 后的图像 。可以看到如果旋转后图像的宽和高保持不变那么肯定会有一部分图片会被裁掉。而如果想要保证旋转后图片的所有目标都保留下来那么新图像就必须至少为浅蓝色框这么大。从图看出浅蓝色框的尺寸为 w 1 w ∗ c o s θ h ∗ s i n θ , h 1 w ∗ s i n θ h ∗ c o s θ w 1w∗cosθh∗sinθ , h 1w∗sinθh∗cosθ w1w∗cosθh∗sinθ,h1w∗sinθh∗cosθ   现在我们知道了在warpAffine() 中要设置的输出尺寸应为cv::Size(w1,h1)。但是还有一点上图的红色框和蓝色框看起来中心点是一样的因为红色框位于蓝色框中心位置。但实际上红色框应该是在左上角的所以两个框的中心点存在偏移而我们就需要计算出偏移量根据偏移量来移动旋转后的图片使其位于中心位置。 那怎么计算偏移量并对旋转图片进行移动呢    1偏移量就是蓝色框中心(newH, newW)和红色框中心(H,W)的差距即 [ n e w H − H / 2 ( n e w W − W ) / 2 ) ] [newH-H/ 2(newW - W) / 2) ] [newH−H/2(newW−W)/2)]    (2)前面说到仿射变换矩阵是一个2×3的形式而它的第三列就是平移向量b0b1。所以在平移向量上加上偏移量就能对旋转图片进行移动到中心位置。 代码示例如下 #include opencv2/opencv.hpp #include cmath #includeiostream using namespace std;int main() {cv::Mat img cv::imread(C:/Opencv/temp/lena.png, 0);int h img.rows;int w img.cols;// 定义仿射旋转矩阵cv::Point2f center(h / 2, w / 2);double angle 30;double scale 1;cv::Mat rM cv::getRotationMatrix2D(center, angle, scale);// 进行普通旋转操作保存原图大小cv::Mat rotationImg1, rotationImg2, rotationImg3;cv::warpAffine(img, rotationImg1, rM, img.size());//cv::imshow(旋转1,缩放0.5, rotationImg1);// 进行特殊旋转操作保存完整目标angle angle / 180 * CV_PI; // 转为弧度制// 新图的尺寸int h1 static_castint(w * fabs(sin(angle)) h * fabs(cos(angle))); int w1 static_castint(w * fabs(cos(angle)) h * fabs(sin(angle)));cv::warpAffine(img, rotationImg2, rM, cv::Size(w1,h1));cv::imshow(旋转2, rotationImg2);// 加上偏移量rM.atdouble(0, 2) (w1 - w) / 2;rM.atdouble(1, 2) (h1 - h) / 2;cv::warpAffine(img, rotationImg3, rM, cv::Size(w1, h1));cv::imshow(旋转3, rotationImg3);cv::waitKey(0);cv::destroyAllWindows();return 0; }注 1在实际使用中往往是把存在偏移角度的目标进行旋转让目标保持水平。为此旋转角度通常为逆时针或超过180度所以计算新尺寸时最好加上绝对值C中用库的fabspython中用Numpy库的np.fbs 2上述例子是自己设定旋转角度和旋转中心。在实际使用时要旋转多少角度比较好呢 其中一种方式就是使用minAreaRect()函数它是获得目标最小外接矩阵的一种函数返回值就有中心位置和与水平线的角度。将其作为getRotationMatrix2D()的输入参数就能旋转图片使目标呈水平线放置。还有一种方式当你有一张原图和要旋转的结果图时可以通过这两张图计算它们之间存在的仿射变换从而得到一个仿射变换矩阵关键函数getAffineTransform()使用方法跟下面的透射变换的getPerspectiveTransform 函数相似。 二、透射变换 仿射变换是一种在平面上的操作而透射变换可以看成一种空间上的操作将图像从一个视角映射到另一个视角OCR中常用。OpenCV提供了cv::warpPerspective函数来进行透射变换。和仿射变换一样需要一个透射变换矩阵常用的方式就是使用 cv::getPerspectiveTransform 函数计算得到透视变换矩阵 getPerspectiveTransform 函数和上面提到的仿射变换的getAffineTransform()相似只不过仿射变换只需要三个像素坐标而透射变换中需要四个像素坐标。 注源图像srcPoints的四个坐标要与目标图像dstPoints的四个坐标一一对应 cv::Mat perspectiveMatrix cv::getPerspectiveTransform(srcPoints, dstPoints);返回值是一个 3x3 的透射变换矩阵warpPerspective函数和仿射变换的warpAffine函数使用方式一样。透射变换的关键问题是在于如何获取源图像的4个像素坐标和目标图像的4个像素坐标。常用的一种方式是使用角点检测来获取目标的边界角点。 cv::Mat img imread(111.png);Point2f src_points[4];Point2f dst_points[4];//设定源图像4个点的像素坐标src_points[0] cv::Point2f(94.0, 374.0);src_points[1] cv::Point2f(507.0, 380.0);src_points[2] cv::Point2f(1.0, 623.0);src_points[3] cv::Point2f(627.0, 627.0);//设置期望透视变换后这四个点的像素坐标dst_points[0] cv::Point2f(0.0, 0.0);dst_points[1] cv::Point2f(627.0, 0.0);dst_points[2] cv::Point2f(0.0, 627.0);dst_points[3] cv::Point2f(627.0, 627.0);cv::Mat rotation, img_warp;rotation cv::getPerspectiveTransform(src_points, dst_points); //计算透视变换矩阵cv::warpPerspective(img, img_warp, rotation, img.size()); //透视变换投影三、极坐标变换 极坐标变换就是将图像在直角坐标系与极坐标系中互相变换它可以将一圆形图像变换成一个矩形图像常用于处理钟表、圆盘等图像。圆形图案边缘上的文字经过及坐标变换后可以垂直的排列在新图像的边缘便于对文字的识别和检测。OpenCV中提供了cv::warpPolar()函数用于实现图像的极坐标变换 void cv::warpPolar(InputArray src,OutputArray dst,Size dsize, 目标图像大小Point2f center, // 极坐标变换时极坐标的原点坐标double maxRadius, // 变换时边界圆的半径它也决定了逆变换时的比例参数int flags // 插值方法与极坐标映射方法标志两个方法之间通过“”或者“|”号进行连接) 可以对图像进行极坐标正变换也可以进行逆变换关键在于最后一个参数如何选择 : WARP_POLAR_LINEAR 极坐标变换 WARP_POLAR_LOG 半对数极坐标变换 WARP_INVERSE_MAP 逆变换 示例代码如下 #include opencv2/opencv.hpp #includeiostream using namespace std;int main() {cv::Mat img cv::imread(C:/Opencv/temp/yuan.png);cv::Mat img1, img2;cv::Point2f center cv::Point2f(img.cols / 2, img.rows / 2); //极坐标在图像中的原点// 正极坐标变换cv::warpPolar(img, img1, cv::Size(400, 800), center, center.x, cv::INTER_LINEAR | cv::WARP_POLAR_LINEAR);// 逆极坐标变换cv::warpPolar(img1, img2, cv::Size(img.cols, img.rows), center, center.x, cv::INTER_LINEAR | cv::WARP_INVERSE_MAP);cv::imshow(原图, img);cv::imshow(正极坐标变换, img1);cv::imshow(负极坐标变换, img2);cv::waitKey(0);cv::destroyAllWindows();return 0; }
http://www.w-s-a.com/news/385105/

相关文章:

  • php网站集成支付宝接口下载免费网络软件
  • 卡盟网站是怎么建设的用花生壳做网站速度可以吗
  • 杭州物联网前十名公司优秀seo平台
  • 网新中英企业网站管理系统wordpress 登录 缓存
  • wordpress模板建站教程wordpress添加广告位手机自适应
  • h5游戏平台入口优化是什么梗
  • 建设银行对公网站打不开网络推广活动方案主题和思路
  • 茶叶网站开发目的和意义网页设计需要考什么证
  • 高端企业网站建设公司怎么做实用性建设网站都需要哪些
  • 网站备案必须要幕布吗易企秀网站怎么做轮播图
  • 南昌网站排名优化四线城市网站建设方向及营利点
  • 做网站需要钱吗unity 做网站
  • 呼伦贝尔市规划建设局网站wordpress怎么考别人的
  • 免备案自助建站网站成都神速建站
  • 怎样编写app软件快速刷排名seo软件
  • 江苏做家纺的公司网站宣传型企业网站
  • 网站网上商城建设外国一些做环保袋的网站
  • 做空气开关那个网站推广比较好建站技术有哪些
  • 做网站前需要做什么准备wordpress图片云储存
  • 查楼盘剩余房源的网站地方网站推广
  • 农家乐网站建设方案创意平面设计公司简介
  • 信息化建设 网站作用网络营销的形式网站营销
  • 沈阳出名网站潍坊正规建设网站
  • 计算机软件开发需要学什么沈阳网站关键字优化
  • 关于军队建设网站国内最好的wordpress主题
  • 小视频网站如何建设陪诊app开发
  • 英文网站首页优化国外手机网站源码
  • 网站建设公司如何找客户网站建设应该考虑哪些问题
  • 创新的江苏网站建设wordpress用户绑定手机
  • 自己做网赌网站网站设计者