当前位置: 首页 > article >正文

7.7opencv中(基于C++) 翻转图像

基本概念

在OpenCV中,翻转图像指的是沿着一个或多个轴翻转图像。OpenCV提供了一个函数 flip 来完成这个任务。这个函数可以沿着水平轴、垂直轴或者同时沿着水平和垂直轴翻转图像。

函数原型

void flip(
    InputArray src,
    OutputArray dst,
    int flipCode
);

参数说明
•src:输入图像,可以是任意类型的单通道或多通道图像。
•dst:翻转后的输出图像,将与输入图像具有相同的类型和大小。
•flipCode:指定翻转的方式: 
 •flipCode > 0:沿y轴翻转(水平翻转)。
 •flipCode == 0:沿x轴翻转(垂直翻转)。
 •flipCode < 0:沿中心翻转(同时沿x轴和y轴翻转)。

示例代码1

下面是一个使用OpenCV C++实现图像翻转的示例代码:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

void flipImage(const Mat &src, Mat &dst, int flipCode) {
	flip(src, dst, flipCode);
}

int main(int argc, char** argv) 
{
	/*if (argc != 2)
	{
		cout << "Usage: ./FlipImage <Image Path>" << endl;
		return -1;
	}*/

	// 加载图像
	Mat img = imread("023.jpeg");
	if (!img.data)
	{
		cout << "Error opening image" << endl;
		return -1;
	}

	// 初始化输出矩阵
	Mat flipped_horizontal, flipped_vertical, flipped_center;

	// 水平翻转
	flipImage(img, flipped_horizontal, 1);

	// 垂直翻转
	flipImage(img, flipped_vertical, 0);

	// 中心翻转
	flipImage(img, flipped_center, -1);

	// 显示结果
	namedWindow("Original Image", WINDOW_NORMAL);
	imshow("Original Image", img);
	namedWindow("Flipped Horizontally", WINDOW_NORMAL);
	imshow("Flipped Horizontally", flipped_horizontal);
	namedWindow("Flipped Vertically", WINDOW_NORMAL);
	imshow("Flipped Vertically", flipped_vertical);
	namedWindow("Flipped Center", WINDOW_NORMAL);
	imshow("Flipped Center", flipped_center);

	waitKey(0);
	destroyAllWindows();

	return 0;
}

代码解释
1. 加载图像:使用 imread 函数加载图像。
2. 初始化输出矩阵:创建新的矩阵来存储翻转后的图像。
3. 水平翻转:使用 flip 函数将图像沿水平轴翻转。
4. 垂直翻转:使用 flip 函数将图像沿垂直轴翻转。
5. 中心翻转:使用 flip 函数将图像沿中心翻转。
6. 显示结果:使用 imshow 函数显示原始图像以及翻转后的图像。

示例运行结果
当你运行上述程序时,将会看到以下几个窗口:
•Original Image:原始图像。
•Flipped Horizontally:沿水平轴翻转的图像。
•Flipped Vertically:沿垂直轴翻转的图像。
•Flipped Center:沿中心翻转的图像。

注意事项
•数据类型:确保输出图像的数据类型与输入图像相同。
•翻转方向:正确选择 flipCode 参数,以实现所需的翻转效果。
•内存管理:确保释放不再使用的图像资源,避免内存泄漏。

进一步的优化
如果你需要进行大量的图像翻转操作,可以考虑将翻转操作封装成一个函数或类,以便于重用代码。此外,你还可以考虑使用多线程来加速图像处理过程,特别是在处理大量图像时。

其他相关函数
除了 flip 函数外,OpenCV还提供了其他一些图像变换函数,例如 warpAffine 和 warpPerspective,这些函数可以实现更复杂的图像变换操作。

实际应用
图像翻转在许多实际应用中都非常有用,例如:
•数据增强:在训练深度学习模型时,可以通过对训练图像进行水平或垂直翻转来增加训练数据的多样性。
•视频处理:在视频编辑中,可以使用翻转功能来调整视频帧的方向。
•图像处理:在图像处理中,翻转操作可以用来纠正拍摄时相机的倾斜或旋转。

通过这些示例和详细解释,你应该能够理解如何在OpenCV中使用C++实现图像的翻转。

运行结果1

示例代码2

下面是一个完整的示例代码:

#include <opencv2/opencv.hpp> // 包含OpenCV的所有模块
#include <iostream>

int main(int argc, char** argv)
{
	/*if (argc != 2)
	{
		std::cout << "Usage: " << argv[0] << " <Image_Path>" << std::endl;
		return -1;
	}*/

	// 读取图像文件
	cv::Mat src = cv::imread("056.jpeg", cv::IMREAD_COLOR);
	if (!src.data)
	{
		std::cout << "Error: Image cannot be loaded!" << std::endl;
		return -1;
	}

	// 创建目标图像
	cv::Mat flipped;

	// 水平翻转图像
	cv::flip(src, flipped, 1); // 1表示水平翻转
	cv::namedWindow("Original Image", cv::WINDOW_NORMAL);
	cv::imshow("Original Image", src);

	cv::namedWindow("Flipped Horizontally", cv::WINDOW_NORMAL);
	cv::imshow("Flipped Horizontally", flipped);
	cv::waitKey(0);

	// 清空flipped以便再次使用
	flipped.release();

	// 垂直翻转图像
	cv::flip(src, flipped, 0); // 0表示垂直翻转
	cv::namedWindow("Flipped Vertically", cv::WINDOW_NORMAL);
	cv::imshow("Flipped Vertically", flipped);
	cv::waitKey(0);

	// 清空flipped以便再次使用
	flipped.release();

	// 对角线翻转图像
	cv::flip(src, flipped, -1); // -1表示沿着图像中心点翻转
	cv::namedWindow("Flipped Diagonally", cv::WINDOW_NORMAL);
	cv::imshow("Flipped Diagonally", flipped);
	cv::waitKey(0);

	return 0;
}

运行结果2


http://www.kler.cn/news/310112.html

相关文章:

  • 完全解决git clone超时和git子模块无法下载问题
  • CSS学习路线
  • 11 vue3之插槽全家桶
  • 【JavaEE】多线程编程引入——认识Thread类
  • mysql怎样优化count(*) from 表名 where …… or ……这种慢sql
  • c++基础入门三
  • Java Web开发中处理Response返回值的技巧与实践
  • 1×1卷积核【super star 卷积核】
  • 【数据结构-线段树】【差分】力扣732. 我的日程安排表 III
  • 基于PHP的丽江旅游管理系统
  • VMware ESXi 7.0U3q macOS Unlocker 集成驱动版更新 OEM BIOS 2.7 支持 Windows Server 2025
  • STM32快速复习(十二)FLASH闪存的读写
  • [Meachines] [Medium] Bart Server Monitor+Internal Chat+UA投毒+Winlogon用户密码泄露权限提升
  • MySQL高阶1777-每家商店的产品价格
  • 文心智能体 恐怖类游戏
  • 一.Oracle每日运维操作
  • bug | pycharm社区版无sciview解决办法
  • JVM 调优篇7 调优案例1-堆空间的优化解决
  • Holynix: v1
  • 基于SSM的在线家用电器销售系统
  • 【ARM】Trustzone和安全架构
  • [SDX35+WCN6856]SDX35 + WCN6856 WiFi导致系统crash问题分析及解决方案
  • (娱乐)魔改浏览器-任务栏图标右上角加提示徽章
  • 线性链条件随机场(Linear Chain Conditional Random Field)-有监督学习方法、概率模型、生成模型、对数线性模型、参数化模型
  • 力扣(LeetCode)每日一题 1184. 公交站间的距离
  • 前后端分离Vue美容店会员信息管理系统o7grs
  • Java-使用反射来处理对象,并构建新的JSON数据结构
  • 换个手机IP地址是不是不一样?
  • spring boot admin集成,springboot2.x集成监控
  • .net core8 使用JWT鉴权(附当前源码)