- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
翻转一个2D矩阵,围绕垂直轴、水平轴或同时围绕两个轴。
该函数以三种不同的方式之一翻转矩阵(行和列的索引是从0开始的):
dst
i
j
=
{
src
src.rows
−
i
−
1
,
j
i
f
flipCode
=
0
src
i
,
src.cols
−
j
−
1
i
f
flipCode
>
0
src
src.rows
−
i
−
1
,
src.cols
−
j
−
1
i
f
flipCode
<
0
\texttt{dst} _{ij} = \left\{ \begin{array}{l l} \texttt{src} _{\texttt{src.rows}-i-1,j} & if\; \texttt{flipCode} = 0 \\ \texttt{src} _{i, \texttt{src.cols} -j-1} & if\; \texttt{flipCode} > 0 \\ \texttt{src} _{ \texttt{src.rows} -i-1, \texttt{src.cols} -j-1} & if\; \texttt{flipCode} < 0 \\ \end{array} \right.
dstij=⎩
⎨
⎧srcsrc.rows−i−1,jsrci,src.cols−j−1srcsrc.rows−i−1,src.cols−j−1ifflipCode=0ifflipCode>0ifflipCode<0
使用该函数的一些示例场景如下:
- 当 flipCode == 0 时,图像的垂直翻转用于在左上角和左下角图像原点之间切换。这是在 Microsoft Windows* 操作系统上进行视频处理的典型操作。
- 当 flipCode > 0 时,对图像进行水平翻转,然后进行水平位移并计算绝对差值以检查是否存在垂直轴对称性。
- 当 flipCode < 0 时,同时进行水平和垂直翻转,然后进行位移并计算绝对差值以检查是否存在中心对称性。
反转点数组的顺序(flipCode > 0 或 flipCode == 0)。
输出图像必须与输入图像具有相同的深度,尺寸应根据给定的 flipCode 正确设置。
注意:
函数的文字ID是 “org.opencv.core.transform.flip”
函数原型
GMat cv::gapi::flip
(
const GMat & src,
int flipCode
)
参数
- 参数 src: 输入矩阵。
- 参数 flipCode: 一个标志,指定如何翻转数组;0表示绕x轴翻转,正值(例如1)表示绕y轴翻转。负值(例如-1)表示同时绕两个轴翻转。
代码示例
#include <opencv2/gapi.hpp>
#include <opencv2/gapi/core.hpp>
#include <opencv2/opencv.hpp>
int main()
{
// 创建一个测试图像
cv::Mat img = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/Lenna.png" );
if ( img.empty() )
{
std::cerr << "无法加载图像" << std::endl;
return -1;
}
// 定义翻转模式,例如沿Y轴翻转(水平翻转)
int flipCode = 1; // 0: 垂直翻转, 1: 水平翻转, -1: 同时垂直和水平翻转
// 将cv::Mat转换为GMat
cv::GMat in;
auto flipped = cv::gapi::flip( in, flipCode );
// 定义并编译G-API图
cv::GComputation flip_comp( cv::GIn( in ), cv::GOut( flipped ) );
cv::Mat flipped_img;
// 应用G-API图到输入图像
flip_comp.apply( cv::gin( img ), cv::gout( flipped_img ) );
// 显示原始和翻转后的图像
cv::imshow( "Original Image", img );
cv::imshow( "Flipped Image", flipped_img );
cv::waitKey();
return 0;
}