旋转图像OCR后,如何将检测矩形正确映射回原图像?
解决旋转ROI后OCR检测框还原到原图像的坐标问题
首先修正你代码里的语法错误:Rotate方法的参数括号写错了,正确写法是:
foundimg = foundimg.Rotate(90, new Gray(255), false);
你之前的坐标转换逻辑错误,核心问题是没有正确结合原ROI的尺寸和位置做逆旋转映射,导致检测框无法对应到原图像的正确位置。
正确的坐标转换逻辑
当你把原ROI(aroi)顺时针旋转90度得到回正的图像foundimg后,OCR得到的检测矩形是基于回正图像的坐标系。要将这些矩形映射回原图像,需要做逆旋转坐标转换,步骤如下:
- 先计算检测矩形在原ROI内部的坐标(逆旋转90度)
- 加上原ROI在原图像中的偏移量,得到最终在原图像中的矩形位置
具体转换公式:
- 原ROI内的X坐标 = 回正图像中矩形的Y坐标
- 原ROI内的Y坐标 = 原ROI的宽度 - 回正图像中矩形的X坐标 - 回正图像中矩形的宽度
- 原ROI内的宽度 = 回正图像中矩形的高度
- 原ROI内的高度 = 回正图像中矩形的宽度
修正后的绘制代码
foreach (Rectangle drawrect in charrect) { // 计算检测矩形在原ROI内的坐标 int roiX = drawrect.Y; int roiY = aroi.Width - drawrect.X - drawrect.Width; int roiWidth = drawrect.Height; int roiHeight = drawrect.Width; // 转换到原图像的坐标系 Rectangle finalRect = new Rectangle( aroi.X + roiX, aroi.Y + roiY, roiWidth, roiHeight ); CvInvoke.Rectangle(resultimg, finalRect, new MCvScalar(0, 252, 0), 1, LineType.EightConnected, 0); }
错误原因说明
你之前的代码误用了foundimg.Width(旋转后图像的宽度,对应原ROI的高度)来计算Y坐标,而正确的应该使用原ROI的宽度(aroi.Width)。同时你错误地对Y坐标取负,忽略了原ROI在原图像中的Y轴偏移(aroi.Y),导致检测框位置完全偏离。
内容的提问来源于stack exchange,提问作者Interceptor
相关产品推荐
相关产品推荐

