如何在 OpenCV C++ 中使用 warpAffine 函数

Posted

技术标签:

【中文标题】如何在 OpenCV C++ 中使用 warpAffine 函数【英文标题】:How to use warpAffine function in OpenCV C++ 【发布时间】:2017-06-06 14:48:28 【问题描述】:

我需要使用仿射变换来扭曲图像。我得到的错误是“代码已崩溃”。

谁能告诉我我的代码有什么问题?

Mat imgAffine, image, par;
image = imread("/media/sf_vbox_share/ubuntushare/board.jpg",1);

par.at<double>(0,0)=  1.01121;  //p1
par.at<double>(1,0)=  0.21067;  //p2;
par.at<double>(0,1)= -89.69693; //p3;
par.at<double>(1,1)= - 0.11557; //p4;
par.at<double>(0,2)= 1.44982;   //p5;
par.at<double>(1,2)= -193.66149;//p6;

imgAffine = Mat::zeros(image.rows, image.cols, image.type());
warpAffine(image,imgAffine,par, image.size(),INTER_LINEAR);
namedWindow("image",WINDOW_AUTOSIZE);
imshow("image",imgAffine);
cvWaitKey(0);

【问题讨论】:

【参考方案1】:

par 的大小未定义,因此在尝试向其写入元素时,很可能会出现分段错误。在设置它的元素之前先尝试为它分配内存:

// Your code
Mat imgAffine, image, par;
image = imread ("/media/sf_vbox_share/ubuntushare/board.jpg",1);

// New code
par = Mat(2, 3, CV_64FC1); // Allocate memory

// Rest of your code
par.at<double>(0,0)=  1.01121;  //p1
par.at<double>(1,0)=  0.21067 ;  //p2;
par.at<double>(0,1)= -89.69693; //p3;
par.at<double>(1,1)= - 0.11557;  //p4;
par.at<double>(0,2)= 1.44982;   //p5;
par.at<double>(1,2)= -193.66149;//p6;
//
// ....
// ....

或者,你可以在声明par时使用cv::Mat的构造函数,所以在代码的开头:

Mat imgAffine, image;
Mat par(2, 3, CV_64FC1);

// Rest of your code
image = imread ("/media/sf_vbox_share/ubuntushare/board.jpg",1);

//
// ....
// ....

【讨论】:

谢谢。现在它运行良好。我需要实现一个插值函数(线性或双三次)。你能建议我任何示例代码,如何检测新创建的像素以及如何根据各自的公式为它们赋予新值.. 这是一个新问题。但是在这里试试:***.com/q/10720586/3250829。如果我已经回答了您的问题,请考虑接受答案,让社区知道您不再需要帮助。这是通过转到这篇文章的顶部,在向上和向下箭头下方的左侧并单击复选标记图标来完成的。祝你好运! 非常感谢您的建议,这很有帮助,但我无法理解如何定位新创建的非整数坐标像素。我得到了 getrectsubpix 这样做。但我无法理解如何使用它。

以上是关于如何在 OpenCV C++ 中使用 warpAffine 函数的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C++ 在 OpenCV 4.2.0 中使用 SIFT? [关闭]

c++中如何调用opencv库

如何在 C++ 中使用 OpenCV 4.2 计算二进制图像的周长

如何在 Flutter 的原生 C++ 中使用 OpenCV 4(2021 年)(支持 Flutter 2.0)? [关闭]

如何使用 c++ 在带有 opencv 3.0.0 的视频中画一条线

OpenCV / C++ - 如何在向量上使用adaptiveThreshold而不是Mat?