http://nuigroup.com/?ACT=28&fid=27&aid=1892_H6eNAaign4Mrnn30Au8d
我正在使用下面的图像进行测试,绿色矩形显示感兴趣的区域.

我在想,如果有可能实现,我希望使用的简单组合的效果cv::getPerspectiveTransform和cv::warpPerspective.我正在分享我到目前为止所写的源代码,但它不起作用.这是结果图像:

因此,有一个vector<cv::Point>是定义感兴趣的区域,但点不存储在任何特定的顺序载体内,这件事情我不能在检测过程中发生改变.无论如何,稍后,向量中的点用于定义a RotatedRect,而这又用于组装cv::Point2f src_vertices[4];,所需的变量之一cv::getPerspectiveTransform().
我对顶点及其组织方式的理解可能是其中一个问题.我还认为使用a RotatedRect不是存储ROI原始点的最佳方法,因为坐标会稍微改变以适应旋转的矩形,这并不是很酷.
#include <cv.h>
#include <highgui.h>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
cv::Mat src = cv::imread(argv[1], 1);
// After some magical procedure, these are points detect that represent …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用OpenCV 的C++ API将1296x968图像旋转90度,我遇到了一些问题.
输入:

旋转:

如您所见,旋转的图像存在一些问题.首先,它具有与原始尺寸相同的尺寸,即使我专门Mat使用原始尺寸的反转尺寸创建目的地.结果,目标图像被裁剪.
我怀疑这种情况正在发生,因为我正在调用warpAffine()并传递原始Mat大小而不是目标大小Mat.但我这样做是因为我遵循了这个答案,但现在我怀疑答案可能是错的.所以这是我的第一个怀疑/问题.
第二,是,warpAffine()是在一定的书面形式向目的地偏移(可能在旋转的数据复制到图像中)和该操作留下了可怕的大黑边的图像周围.
我该如何解决这些问题?
我正在分享以下源代码:
#include <cv.h>
#include <highgui.h>
#include <iostream>
using namespace cv;
using namespace std;
void rotate(Mat& image, double angle)
{
Point2f src_center(image.cols/2.0F, image.rows/2.0F);
Mat rot_matrix = getRotationMatrix2D(src_center, angle, 1.0);
Mat rotated_img(Size(image.size().height, image.size().width), image.type());
warpAffine(image, rotated_img, rot_matrix, image.size());
imwrite("rotated.jpg", rotated_img);
}
int main(int argc, char* argv[])
{ …Run Code Online (Sandbox Code Playgroud) 场景是这样的:我有一张纸的图片,我想做一些OCR.因此,请将下面的图片作为我的输入示例:

在成功检测到与纸张对应的区域后,我留下了vector<Point>4个坐标,这些坐标定义了图像内部的位置.请注意,由于摄像机的距离和拍摄照片时的角度,这些坐标可能与完美的矩形不对应.出于查看目的,我连接了子图像中的点,以便您可以看到我的意思:

在这种情况下,要点是:[1215,43],[52,67],[56,869]和[1216,884]
此时,我需要调整这些点,使它们水平对齐.那是什么意思?如果您注意到上面子图像的区域,则会稍微旋转:图像右侧的点位置略高于另一侧的点.
换句话说,我们有图像A,它被夸大了,看起来比现实更加扭曲/旋转,然后是图像B - 这就是我想要的最终结果:
一个)
B) 
我不确定可以使用哪种技术来实现这种转换.应用程序还需要自动检测需要完成多少旋转,因为我无法控制图像采集过程.
目的是Mat使用标准化的子图像获得新的.我现在并不担心可能的图像失真,我只是想找到一种方法来确定需要对子图像进行多少旋转以及如何应用它并获得更矩形的区域.
我想我应该cv::remap用来消除失真,但无法弄清楚const Mat& map1, const Mat& map2应该是什么地图来实现这一点.
我应该使用它cv::initUndistortRectifyMap来找出价值观吗?如果是这样,我真的很感激一个例子.我没有固有的相机参数或不知道如何计算它们.谢谢.