课程设计,如果使用 OpenCV 库

基于OpenCV的数字图像处理

LittleGirl

发布日期: 3 年前浏览量: 1760收藏:7

评分:

star star star star star star star star star_border star_border

*转载请注明来自write-bug.com

1 任务陈述

1.1 项目意义陈述

进入 21 世纪以来,我国信息产业在生产和科研领域都出现了长足的进步,并成为国民经济的支柱产业之一。数字图像处理作为信息产业的重要一环,从 20 世纪 20 年代第一张数字图像通过海底电缆从伦敦传送至纽约以来,数字图像的处理收到了充分的关注和普遍的运用。图像处理科学与国民计生关系密切的学科,他能够为人类带来巨大的经济与社会效益。

本课程设计要求我们利用 OpenCV 1.0,OpenCV 作为一个轻量级且高效的跨平台图像处理库,为图像处理和计算机视觉提供了很多算法。我们需要通过利用其图像容器, 对图像进行各种操作。

我们通过学习简单的数字图像处理技术,对数字图像处理有一个感性的认识,对以后涉足此领域提供了兴趣基础。

1.2 项目设计任务

1.2.1 题目描述

读入一幅彩色的数字图像,完成一系列的几何运算,并分别输出每个运算的效果图。

1.2.2 题目要求

  • 先将彩色图像变为灰度图像
  • 然后将灰度图像旋转任意角度;如果能对彩色图像进行相应旋转加分
  • 最后将灰度图像和彩色图像进行水平镜像和垂直镜像
  • 自定义函数完成将图像保存为 bmp 格式系统功能结构和调用关系

1.2.3 输入/输出要求

  • 应用程序运行后,先显示一个菜单,然后用户根据需要选择相应的操作项目。 进入每个操作后,根据程序的提示输入相应的信息
  • 输出每个功能的效果图

1.2.4 编写源程序的要求

  • 能够实现任务书中的功能
  • 尽可能使界面友好、直观、易操作
  • 源程序要有适当的注释,使程序容易阅读

2 功能介绍和流程图

该程序主要实现对彩色图像或灰度图像分别进行旋转、镜像和保存的功能。

3 设计详情

3.1 主函数功能

  • 主函数原型:int main()
  • 功能:声明版权,在主函数里调用功能函数,实现功能
  • 代码:

函数调用关系

3.2 读取图像

  • 函数原型:void loadimg();
  • 功能:使用 cvLoadimg 函数读取图像存在 IplImage 类指针中,判断图像是否正确读取,若正确读取则显示图像并显示图像信息,否则退出程序
  • 代码:

3.3 选择操作类型函数

  • 函数原型:void slco();
  • 功能:打印界面,提示选择程序操作; 说明:通过循环调用,程序将反复调用选择操作函数

3.4 灰度图像转换函数

  • 函数原型:void toGrayimg();
  • 功能:把图像转换成灰度图像,并调用保存图像函数保存图像
  • 代码:

3.6 灰度图像旋转函数

  • 函数原型:void roGimg();
  • 功能:先构建单通道图像,把图像转换为灰度图像后旋转,先将图像转换为 cvMat 类型,构建变换函数,利用 cvWarpAffine 的图像仿射函数实现旋转后存在单通道图像内传递给保存函数
  • 代码:

3.7 彩色图像旋转

  • 函数原型:void roRGBimg();
  • 功能:先将图像转换为 cvMat 类型,构建变换函数,利用 cvWarpAffine 的图像仿射函数实现旋转
  • 代码 switch-case 选择结构撰写。

3.8 选择镜像图像操作种类

  • 函数原型:灰度图像 void seltype();
    彩色图像 void seltype1();
  • 功能:seltype()中现将图像转换至灰度图像,再根据传递给变换函数。seltype1() 中是根据用户指令直接传递至变换函数
  • 代码:此处为 seltype()函数代码作为样例

3.9 水平镜像函数

  • 函数原型:void rollkd1(IplImage *src);
  • 功能:同样利用 cvWarpAffine 函数,通过构建变换矩阵 m
    其中 width 表示图像宽度,利用函数进行水平镜像变换

  • 代码:

  • 说明:src 表示原图像,result 表示目标图像,&flipper 表示变换矩阵, CV_INTER_LINEAR 表示填充像素,用来 cvScalarALL(0)表示图像通道

3.10 垂直镜像函数

  • 函数原型:void rollkd2(IplImage *src);
  • 功能:和水平镜像类似,对图像进行垂直变换,构建矩阵如下:

  • 代码:

4 调试运行与输出结果

4.1 程序界面

4.1.1 主界面操作选择

4.1.2 选择镜像类型

4.1.3 结果输出

4.2 程序输出结果展示

5 程序使用说明

使用 cmd 命令进入程序

图片显示跳出后按任意键进入主界面操作。若图片无法成功读取,请确保文件格式为 png 且文件名为 input,错误提示将如下图所示:

成功读取图片后,进入菜单选择要进行的操作。

每次操作,图片都会跳出显示转换后图片,并按任意键退出。

6 心得体会

本次课程设计,如果使用 OpenCV 库,难度还是可以的。我也在尝试写纯 C 代码, 看了网上不少别人的代码和资料,尝试着写了纯 C 代码,始终在构建点操作的矩阵时 程序会报错,花了一个通宵写了两百行纯 C 却发现 bug 多的难以修改。我对数字图像处 理本身就有着浓烈的兴趣,也一直有阅读冈萨雷斯的《数字图像处理》这本大部头的书, 也和侯老师参加图像处理的讨论班。对数字图像处理的原理有一定了解,对其中也略知 一二。这是第一次自己真正参与编写这样的代码,发现不依赖 OpenCV 库就难以编写图像变换程序,让我深知编写底层代码的不易,对现代编程有完整的库可以调用深感幸运。

这次编写提高了我写代码的水平和理解能力,如果有更加充足的时间,我想我的程序还有改进空间:

  • 第一,是尽量不使用库函数而是尽量使用纯 C 代码编写,对于图像点 运算只是简单地数组变换并不难,重点就在于怎么将图像填充在数组之内
  • 第二,扩充程序功能,是程序有更多的功能例如拉伸等
  • 第三,让程序有界面,是用户能通过简单 地点击鼠标实现功能,更具有美观性。
  • 最后感谢老师这几天以来的教导,能让我们获得知识,也复习了 C 语言,为接下来的考试做准备

7 问题解决办法

在程序编写过程之中,我遇到了一些困难,通过查找资料顺利的解决了这些问题。

首先是处理永远在循环之中无法正常退出,后来检查时发现忘记加 break 控制语句, 实属粗心不应该。

其次是镜像变换时 OpenCV 总是会提示图像通道错误,后来发现是灰度图像和彩色图像通道不一致所致,于是在 190 行处的创建目标图像时判断传入图像的通道得以解决。 还有的问题未能及时记录,但是也通过查阅书籍解决。其中《OpenCV 教程:基础篇》 为我提供了极大地帮助,促进了代码的编写,让我能够顺利完成课程设计。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值