旋转函数RotateDIB会使画布变大,旋转越多就越大,但我用旋转只是想纠正原来被旋转过的正方形,希望画布变小,要怎么做?

ljooo 2008-07-23 04:15:26
比如我把一个正方形顺时钟选择了25度,画布变大了。我想逆时针旋转25恢复原来的正方形,让画布跟原来一样大,但实际是每次旋转画布都会变大,我怎么修改原来的算法,使它变小呢?

这是原来的代码:

// 将旋转角度从度转换到弧度
fRotateAngle = (float) RADIAN(iRotateAngle);

// 计算旋转角度的正弦
fSina = (float) sin((double)fRotateAngle);

// 计算旋转角度的余弦
fCosa = (float) cos((double)fRotateAngle);

// 计算原图的四个角的坐标(以图像中心为坐标系原点)
fSrcX1 = (float) (- (lWidth - 1) / 2);
fSrcY1 = (float) ( (lHeight - 1) / 2);
fSrcX2 = (float) ( (lWidth - 1) / 2);
fSrcY2 = (float) ( (lHeight - 1) / 2);
fSrcX3 = (float) (- (lWidth - 1) / 2);
fSrcY3 = (float) (- (lHeight - 1) / 2);
fSrcX4 = (float) ( (lWidth - 1) / 2);
fSrcY4 = (float) (- (lHeight - 1) / 2);

// 计算新图四个角的坐标(以图像中心为坐标系原点)
fDstX1 = fCosa * fSrcX1 + fSina * fSrcY1;
fDstY1 = -fSina * fSrcX1 + fCosa * fSrcY1;
fDstX2 = fCosa * fSrcX2 + fSina * fSrcY2;
fDstY2 = -fSina * fSrcX2 + fCosa * fSrcY2;
fDstX3 = fCosa * fSrcX3 + fSina * fSrcY3;
fDstY3 = -fSina * fSrcX3 + fCosa * fSrcY3;
fDstX4 = fCosa * fSrcX4 + fSina * fSrcY4;
fDstY4 = -fSina * fSrcX4 + fCosa * fSrcY4;

即从 fDstX1,fDstY1 和角度iRotateAngle(跟原来方向相反了),反过来求 fSrcX1,fSrcY1。
我不熟悉三角函数,希望有人帮帮忙,谢谢。
...全文
190 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ljooo 2008-07-28
  • 打赏
  • 举报
回复
我没用OPENCV。我最后还是先旋转,然后判断有像素的范围,再裁剪。
scq2099yt 2008-07-24
  • 打赏
  • 举报
回复
up
ljooo 2008-07-24
  • 打赏
  • 举报
回复

另外一个贴人家的公式 Img->width原来的宽度求后来的宽度width_tmp。
int width_tmp = int (fabs((sin(angleRad) * Img->width)) +
fabs((cos(angleRad) * Img->height)));

int height_tmp = int (fabs((sin(angleRad) * Img->height)) +
fabs((cos(angleRad) * Img->width)));

那从后来的宽度width_tmp求原来的宽度Img->width, 即它的反函数是什么呢?
ljooo 2008-07-24
  • 打赏
  • 举报
回复
我在1楼发的做法是错误的。
是做图像识别用的,不知道有什么算法可以识别旋转的数字,因此想先矫正角度再识别。正如你说的,正常是先旋转再裁剪,不过不要通常的边缘检测算法了,只需要从上下左右四个方向逼近,直到有黑色像素。我想理论上旋转和裁剪可以同时做的。

算了一个多小时(数学太差了),得到下面这个公式。
// 计算旋转后的图像实际宽度
lNewWidth=fabs((lHeight*fSina-lWidth*fCosa)/(fSina*fSina-fCosa*fCosa));
// 计算旋转后的图像实际高度
lNewHeight=fabs((lWidth*fSina-lHeight*fCosa)/(fSina*fSina-fCosa*fCosa));

//不需要下面这些变量了。
// 源图四个角的坐标(以图像中心为坐标系原点)
//float fSrcX1,fSrcY1,fSrcX2,fSrcY2,fSrcX3,fSrcY3,fSrcX4,fSrcY4;
//// 旋转后四个角的坐标(以图像中心为坐标系原点)
//float fDstX1,fDstY1,fDstX2,fDstY2,fDstX3,fDstY3,fDstX4,fDstY4;
好像在小角度(20度以内)下是正确的,角度大点就错了。45度因为分母为0,(因为是纠正操作,原图在之前旋转了45度,一定lHeight=lWidth,所以分子也为0 ),会出错。
我想这肯定可以推出一个公式,而且不会很复杂,只是我不知道怎样得出。
菜牛 2008-07-24
  • 打赏
  • 举报
回复
矩形旋转后,只要不是旋转90度的倍数,其外包矩形肯定变大了,一般旋转算法肯定要取这个外包矩形作为新的大小,否则就丢数据了。对于你的情况,要么做边缘检测重新设置位图大小,要么后处理由用户选择新的位图大小。当然如果矩形大小是固定的,旋转角度也是固定的,那么简单点直接裁剪掉就可以了。
qidongpan 2008-07-24
  • 打赏
  • 举报
回复
旋转后再缩小,用OPENCV可保证缩小后图片的质量。
ljooo 2008-07-23
  • 打赏
  • 举报
回复
误导人了。不是改上面的代码,是改这里:
// 计算旋转后的图像实际宽度
//原来的代码
//lNewWidth = (LONG) ( max( fabs(fDstX4 - fDstX1), fabs(fDstX3 - fDstX2) ) + 0.5);
//修改后的
lNewWidth = (LONG) ( ( fabs(fDstX4 - fDstX1)+fabs(fDstX3 - fDstX2) )/2 + 0.5);


// 计算旋转后的图像高度
//lNewHeight = (LONG) ( max( fabs(fDstY4 - fDstY1), fabs(fDstY3 - fDstY2) ) + 0.5);
lNewHeight = (LONG) ( ( fabs(fDstY4 - fDstY1)+fabs(fDstY3 - fDstY2) )/2 + 0.5);
内容概要:本文系统研究了基于豪猪优化算法(CPO)的多无人机协同集群在三维空间中的避障路径规划问题,聚焦于实现以最低成本为目标的航迹优化,综合考虑路径长度、飞行高度、威胁规避及转弯角度等多个关键因素。通过构建精细化的三维环境模型与多无人机协同机制,采用Matlab平台实现CPO算法的仿真与验证,充分展示了该算法在复杂动态障碍环境下的高效搜索能力与全局优化性能。研究不仅涵盖了路径规划的数学建模与目标函数设计,还深入探讨了算法的收敛特性与鲁棒性,为智能群体系统在实际场景中的应用提供了理论依据与技术支撑。; 适合人群:具备一定编程基础和优化算法背景,从事无人机系统控制、智能路径规划、群体协同、人工智能与自动化等相关领域的科研人员、高校研究生及工程技术人员。; 使用场景及目标:①应用于多无人机协同执行侦察、灾害监测、应急救援、区域巡检等复杂任务中的自主路径规划;②为智能优化算法在三维动态环境下的路径决策问题提供可复现的技术范例;③支持研究人员对CPO算法与其他主流群智能算法(如PSO、GWO、WOA等)进行性能对比与改进研究,推动路径规划技术的发展。; 阅读建议:建议结合提供的Matlab代码进行实践操作,重点理解目标函数的多维度建模方式与CPO算法的迭代优化流程,可通过调整环境参数与约束条件进行仿真实验,对比不同算法在相同场景下的路径质量与收敛速度,从而深入掌握其优势与适用边界。
内容概要:本文围绕电动汽车参与电力系统运行备用的能力评估展开深入研究,利用Matlab代码实现对电动汽车集群提供运行备用服务的建模与仿真分析。研究重点在于量化电动汽车作为分布式灵活资源参与电网辅助服务的潜力,通过构建精细化的数学模型,分析其可调功率容量、响应速度、时空分布特性及聚合能力,并采用多面体聚合、内近似模型与闵可夫斯基和等先进方法精确刻画其可调度能力边界。研究进一步结合大规模电动汽车接入场景,探讨其在多时间尺度调度框架下参与调峰、调频等辅助服务的优化策略,评估其对提升高比例可再生能源电网灵活性与稳定性的贡献,最终通过仿真验证所提模型与方法的有效性与实用性。; 适合人群:具备电力系统分析、智能电网、新能源汽车或优化调度等相关专业背景,熟悉Matlab/Simulink仿真工具,从事科研、工程应用的高校研究生、科研人员及电力行业工程师。; 使用场景及目标:①精确评估大规模电动汽车集群在不同约束条件下可提供的运行备用容量;②研究电动汽车在日前、日内及实时调度中的动态响应能力与优化调度策略;③为高渗透率新能源电力系统提供基于移动储能的灵活性资源解决方案,支撑电网安全经济运行。; 阅读建议:建议结合Matlab代码与技术文档同步学习,重点关注多面体聚合建模、能力边界计算及优化调度算法的设计与实现,可进一步拓展至V2G(车辆到电网)、需求响应等互动场景进行二次开发与应用验证。
打开链接下载源码: https://pan.quark.cn/s/a4b39357ea24 OpenCV(开源计算机视觉库)中的DNN(Deep Neural Network)模块是一种功能强大的工具,其目的是用于深度学习模型的操作。该模块使得开发人员能够在OpenCV环境中直接运用已经训练好的深度学习网络,以执行图像识别、目标检测、图像分割等多种功能。DNN模块能够兼容多种深度学习框架的模型,包括TensorFlow、Caffe、ONNX等。 一、DNN模块概述 OpenCV的DNN模块是为了简化深度学习模型的集成过程而专门设计的,它允许开发人员加载预先训练好的神经网络模型,并在图像数据上执行前向传播操作。借助这个模块,用户可以选用GPU或者CPU来提升计算效率,从而构建出高效的应用程序。 二、目标检测案例 在OpenCV的DNN模块中,目标检测是一个常见的应用情形。例如,可以选用SSD(Single Shot Multibox Detector)、YOLO(You Only Look Once)或者 Faster R-CNN 等模型进行实时的目标检测。这些模型能够识别并定位图像中的多个对象,并返回每个对象的类别和边界框坐标。 三、模型转换:PB到PBTXT 在OpenCV中运用TensorFlow模型时,通常需要处理的是`.pb`格式的模型文件,这是TensorFlow的二进制模型文件格式。然而,为了能够读取模型的结构信息,我们需要`.pbtxt`格式的文本文件。转换过程涉及解析`.pb`文件并将其结构信息导出为`.pbtxt`格式,这样可以让人清晰地了解网络层和参数的配置。在OpenCV中,可以使用`tf.train.write_graph()`函数将.pb...

19,464

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧