如何在 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 4.2 计算二进制图像的周长
如何在 Flutter 的原生 C++ 中使用 OpenCV 4(2021 年)(支持 Flutter 2.0)? [关闭]