如何理解opencv中warpAffine的源代码
How to understand the source code of warpAffine in opencv
我正在opencv中学习cv::warpAffine()
的源代码,我有两个问题。
这是第一个问题。就像下面的代码一样,在通过调用函数cv::getAffineTransform()
来计算变换矩阵之后,我们调用cv::warpAffine()
来扭曲图像。
cv::Point2f src[3], dst[3];
src[0] = cv::Point2f(35.148750, 255.26263);
src[1] = cv::Point2f(293.08679, 215.27223);
src[2] = cv::Point2f(153.83780, 168.80141);
dst[0] = cv::Point2f(35.000000, 275.00000);
dst[1] = cv::Point2f(293.00000, 215.00000);
dst[2] = cv::Point2f(116.00000, 126.00000);
cv::Mat image = cv::imread("C:/Users/CJZ/Desktop/TestSample/eye_test.jpg");
cv::Mat reslt = cv::Mat(image.rows * 1.3, image.cols * 1.3, image.type(), cv::Scalar::all(255));
cv::Mat warpMat = cv::getAffineTransform(src, dst);
cv::warpAffine(image, reslt, warpMat, reslt.size());
当我看到cv::warpAffine()
的源代码时,我发现变换矩阵又被重新计算了。
if( !(flags & WARP_INVERSE_MAP) )
{
double D = M[0]*M[4] - M[1]*M[3];
D = D != 0 ? 1./D : 0;
double A11 = M[4]*D, A22=M[0]*D;
M[0] = A11; M[1] *= -D;
M[3] *= -D; M[4] = A22;
double b1 = -M[0]*M[2] - M[1]*M[5];
double b2 = -M[3]*M[2] - M[4]*M[5];
M[2] = b1; M[5] = b2;
}
这个计算的意义是什么?
这是第二个问题。我在源代码中发现了一些枚举变量,它们让我感到困惑。似乎我们可以使用它们来优化速度,但为什么?我希望有人能给我关于优化的细节。
enum
{
INTER_BITS=5, INTER_BITS2=INTER_BITS*2,
INTER_TAB_SIZE=(1<<INTER_BITS),
INTER_TAB_SIZE2=INTER_TAB_SIZE*INTER_TAB_SIZE
};
还有最后一件事。我发现cv::warpAffine
的架构对我来说又大又难。有关于它的文章吗?
关于你的最后一个问题:看看George Wolberg关于数字图像扭曲的书,它涵盖了仿射(2D)扭曲。
相关文章:
- 在Linux中哪里可以找到互斥、未来等的源代码
- 如果编译的源代码是特定于它编译的硬件的,我们如何分发它
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 难以理解某些人解决IOI问题的源代码
- 使用g++编译hdf5源代码
- 如何使用C++读取另一个程序中的源代码输出
- Poco FindMySql.cmake 无法找到 MySQL 源代码
- 更改命令行 qt5 源代码构建配置的正确/快速方法
- C++出现控制台错误.我无法识别源代码的问题
- Qt Quick,如何更改 Ui 源代码?
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- 从macOS Catalina上的源代码编译LLVM(如何解决未找到"stdio.h")
- 如何使用QT创建器获取网页源代码?
- 从源代码构建 gRPC C++
- 如何使用我构建的库,而不会从源代码出错,但不为我自己的项目编译?
- 如何在使用 LLVM 编译时获取部分源代码的二进制代码
- 如何在源代码中包含外部库的头文件?
- 如何查找 torch.bmm 的 c++ 源代码 pytorch.
- 是否有可能使用debug_info获取ELF文件的源代码?
- 如何理解opencv中warpAffine的源代码