ADI Blackfin DSP处理器-BF533的开发详解48:图像处理专题-Rotation (图像旋转处理)(含源码)

news2024/11/29 2:37:46

硬件准备

ADSP-EDU-BF533:BF533开发板
AD-HP530ICE:ADI DSP仿真器

软件准备

Visual DSP++软件

硬件链接

在这里插入图片描述

功能介绍

代码实现了图像旋转处理,代码运行时,会通过文件系统打开工程文件根目下" …/ImageView"路径中的 testin.bmp 文件,进行图像旋转处理后把图片保存到工程文件根目下" …/ImageView"路径中的 testout.bmp 文件,并且将处理后的图片显示到液晶屏上。例子中的算法只支持尺寸为 480*272 的 24bit 的 bmp 图片,可以根据自己的需要自行调整。

代码使用说明

funct.c 中的 RotateImage(BMPIMAGE *img,int iRotateAngle)
该函数是将读取的图像进行旋转处理。

BMPIMAGE * 图像结构体指针
int iRotateAngle 旋转的角度,逆时针旋转,本例子程序只支持以下角度的旋转{0,30,45,60,90,120,135,150,180,210,225,240,270,300,315,330,360}
在 main.c 文件中定义了一个#define LCD_VIEW_ENABLE 宏开关,如果不需要将处理后的图片显示在液晶屏上,只需将这个宏开关注释掉。

代码实验步骤

  1. 将工程文件根目下的 ImageView 文件夹内存放一个名为 testin.bmp 的图像文件,该文件尺寸为 480*272 的24bit 的 bmp 图片(默认已存一幅测试图片)。
  2. 打开工程文件 BF53x_Rotation.dpj,编译并运行代码
  3. 等待图像处理,处理完成之后会在液晶屏上显示处理后的图片,并在工程文件根目下的 ImageView 文件夹内生成一个处理后名为 testout.bmp 图片。

代码实验结果
1.液晶屏上显示处理后的图片。
2.在工程文件根目下的 ImageView 文件夹中查看处理后名为 testout.bmp 图片。

程序源码

#include “bmp.h”
#include “math.h”

#define PI 3.14159
//角度到弧度转化的宏
#define RADIAN(angle) ((angle)*PI/180.0)

/********************************************************

  • 函数名 : RotateImage
  • 函数功能 : 图像旋转处理
  • 函数参数 : BMPIMAGE * 图像结构体指针
    int iRotateAngle 旋转的角度
  • 函数返回值 :FALSE 处理失败
  •   			TRUE	处理成功
    

********************************************************/
int RotateImage(BMPIMAGE *img,int iRotateAngle)
{
// 指向源象素的指针
unsigned char *lpSrc;
// 指向旋转图像对应象素的指针
unsigned char *lpDst;
// 图像的宽度和高度
long lWidth;
long lHeight;
// 旋转后图像的宽度和高度
long lNewWidth;
long lNewHeight;
// 图像每行的字节数
long lLineBytes;

// 旋转后图像的宽度(lNewWidth',必须是4的倍数)
long	lNewLineBytes;

lWidth = img->infohead.BiWidth;
lHeight = img->infohead.BiHeight;

lLineBytes= WIDTHBYTES(lWidth * 24);

unsigned char *lpDIBBits = img->imgbuf;
unsigned char *lpNewDIBBits;	// 循环变量(象素在新DIB中的坐标)	

// 象素在新DIB中的坐标
long	i;
long	j;
unsigned char     k=0;
unsigned char	temp;

// 象素在源DIB中的坐标
long	i0;
long	j0;

// 旋转角度(弧度)
float	fRotateAngle;

// 旋转角度的正弦和余弦
float	fSina, fCosa;

// 源图四个角的坐标(以图像中心为坐标系原点)
float	fSrcX1,fSrcY1,fSrcX2,fSrcY2,fSrcX3,fSrcY3,fSrcX4,fSrcY4;

// 旋转后四个角的坐标(以图像中心为坐标系原点)
float	fDstX1,fDstY1,fDstX2,fDstY2,fDstX3,fDstY3,fDstX4,fDstY4;

// 两个中间常量
float	f1,f2;

// 将旋转角度从度转换到弧度
fRotateAngle = (float) RADIAN(iRotateAngle);

// 计算旋转角度的正弦
fSina = (float) sin((double)fRotateAngle);

// 计算旋转角度的余弦
fCosa = (float) cos((double)fRotateAngle);
if(iRotateAngle%90==0)
{
	temp = 0;
}
else
{
	temp = 1;
}	
// 计算原图的四个角的坐标(以图像中心为坐标系原点)
fSrcX1 = (float) (- (lWidth-temp  ) / 2);
fSrcY1 = (float) (  (lHeight-temp ) / 2);
fSrcX2 = (float) (  (lWidth-temp  ) / 2);
fSrcY2 = (float) (  (lHeight-temp ) / 2);
fSrcX3 = (float) (- (lWidth-temp  ) / 2);
fSrcY3 = (float) (- (lHeight-temp ) / 2);
fSrcX4 = (float) (  (lWidth-temp  ) / 2);
fSrcY4 = (float) (- (lHeight-temp ) / 2);

// 计算新图四个角的坐标(以图像中心为坐标系原点)
fDstX1 =  fCosa * fSrcX1 + fSina * fSrcY1;
fDstY1 = -fSina * fSrcX1 + fCosa * fSrcY1;
fDstX2 =  fCosa * fSrcX2 + fSina * fSrcY2;
fDstY2 = -fSina * fSrcX2 + fCosa * fSrcY2;
fDstX3 =  fCosa * fSrcX3 + fSina * fSrcY3;
fDstY3 = -fSina * fSrcX3 + fCosa * fSrcY3;
fDstX4 =  fCosa * fSrcX4 + fSina * fSrcY4;
fDstY4 = -fSina * fSrcX4 + fCosa * fSrcY4;

// 计算旋转后的图像实际宽度
lNewWidth  = (long) ( max( fabs(fDstX4 - fDstX1), fabs(fDstX3 - fDstX2) ) + 0.5);

// lNewLineBytes = (long) ( max( fabs((fDstX4 - fDstX1)*3), fabs((fDstX3 - fDstX2)3) ) + 0.5);
// 计算新图像每行的字节数
lNewLineBytes = WIDTHBYTES(lNewWidth * 8
3);

// 计算旋转后的图像高度
lNewHeight = (long) ( max( fabs(fDstY4 - fDstY1), fabs(fDstY3 - fDstY2) )  + 0.5);

// 两个常数,这样不用以后每次都计算了
f1 = (float) (-0.5 * (lNewWidth - 1) * fCosa - 0.5 * (lNewHeight - 1) * fSina
	+ 0.5 * (lWidth  - 1));
f2 = (float) ( 0.5 * (lNewWidth - 1) * fSina - 0.5 * (lNewHeight - 1) * fCosa
	+ 0.5 * (lHeight - 1));

lpNewDIBBits = (unsigned char*)malloc(lNewLineBytes*lNewHeight);
if(lpNewDIBBits == NULL)

		return FALSE;

// 针对图像每行进行操作

	for(i = 0; i < lNewHeight; i++)
{
	// 针对图像每列进行操作
	for(j = 0; j < lNewWidth; j++)
	{
		for(k=0;k<3;k++)
			{
			// 指向新DIB第i行,第j个象素的指针
			// 注意此处宽度和高度是新DIB的宽度和高度
			lpDst = (char *)lpNewDIBBits + lNewLineBytes * (lNewHeight - 1 - i) + j*3+k;
		
			// 计算该象素在源DIB中的坐标
			i0 = (long) (-((float) (j)) * fSina + ((float) i) * fCosa + f2 + 0.5);
			j0 = (long) ( ((float) (j)) * fCosa + ((float) i) * fSina + f1 + 0.5);
		
			// 判断是否在源图范围内
			if( (j0 >= 0) && (j0 < lWidth) && (i0 >= 0) && (i0 < lHeight))
			{

					// 指向源DIB第i0行,第j0个象素的指针
					lpSrc = (char *)lpDIBBits + lLineBytes * (lHeight - 1 - i0) + j0*3+k;
			
					// 复制象素
					*lpDst = *lpSrc;
			}
			else
			{
				// 对于源图中没有的象素,直接赋值为255
				* ((unsigned char*)lpDst) =122;
			}
		}
	}
}		


free(img->imgbuf);
img->imgbuf = lpNewDIBBits;
img->infohead.BiWidth = lNewWidth;
img->infohead.BiHeight = lNewHeight;
img->imagesize = lNewLineBytes*lNewHeight;
	// 返回
return TRUE;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/85311.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【OpenCV-Python】教程:5-1 背景减法

OpenCV Python 背景减法 【目标】 读视频与显示视频创建背景模型与更新背景模型 【概述】 背景相减&#xff08;BS&#xff09;是一种常用且广泛使用的技术&#xff0c;用于通过使用静态相机来生成前景掩模&#xff08;即&#xff0c;包含属于场景中运动对象的像素的二值图…

UEFI固件使用OpenSSL暴露了软件材料清单(SBOM)

Binarly REsearch团队近日深入研究了最近的OpenSSL安全更新给UEFI固件供应链生态系统带来怎样的影响以及OpenSSL版本在固件环境中是如何广泛使用的。研究结果不容乐观。 科技行业正在积极讨论使用“软件材料清单”&#xff08;SBOM&#xff09;来化解供应链安全风险。为了确保…

前端面试常考 | js闭包

文章目录一. 闭包1. 介绍闭包2. 闭包的作用3. 闭包与变量二. 闭包引起的内存泄漏1. 闭包是如何引起内存泄漏的2. 如何解决闭包引起的内存泄漏三. 最后一. 闭包 1. 介绍闭包 有不少开发人员总是搞不清楚匿名函数与闭包两个概念&#xff0c;因此经常混用。同时闭包也是我们前端…

我见过最好的天线基础知识

天线作为无线电的发射和接收设备是影响信号强度和质量的重要设备,其在移动通信领域的重要性非常关键。通过对天线选型,天 线安装,天线调整从而保障基站覆盖区域的信号强度与质量。对其的 掌握程度是网规与网优工程师的技能基本要求之一。下文重点说明天线要掌握哪些方面及其原理…

版本控制 | 如何将 UnrealGameSync 与 Perforce Helix Core 结合使用

为了帮助虚幻引擎4和虚幻引擎5的开发&#xff0c;Epic公司开发了UnrealGameSync&#xff0c;使其与版本控制工具Perforce Helix Core交互。虽然UnrealGameSync除了P4V (Helix Core客户端)之外还有许多功能&#xff0c;但主要用途是分发内部引擎和项目构建&#xff0c;它极大地简…

springboot+vue

一、案例结构 用springboot做后端接口&#xff0c;采用restful风格。用vue-cli来创建前端项目&#xff0c;通过axios进行前后端交互。来实现用户的增删改查操作。二、效果图 点击修改&#xff1a; 点击添加&#xff1a; 三、服务器端 控制层代码&#xff1a; package com.ex…

【Tryhackme】dogcat(LFI+文件解析漏洞,Docker逃逸)

免责声明 本文渗透的主机经过合法授权。本文使用的工具和方法仅限学习交流使用&#xff0c;请不要将文中使用的工具和渗透思路用于任何非法用途&#xff0c;对此产生的一切后果&#xff0c;本人不承担任何责任&#xff0c;也不对造成的任何误用或损害负责。 服务发现 ┌──(r…

CentOS7.4安装教程

CentOS7.4安装教程&#xff1a; centos系统自行网上查找链接下载&#xff0c;我使用的是最小安装版本&#xff0c;搞服务器用 1、进入操作系统&#xff0c;选择第一项进行安装&#xff1a; 2、耐心等待&#xff0c;直到弹出这个界面&#xff1a; 3、下拉选择中文&#xf…

磷脂-荧光素标记DSPE-FITC磷脂改性荧光素

磷脂-荧光素标记DSPE-FITC磷脂改性荧光素 中文名称&#xff1a;荧光素标记二硬脂酰磷脂酰乙醇胺 中文别称&#xff1a;磷脂-荧光素标记&#xff1b;二硬脂酰磷脂酰乙醇胺改性荧光素 英文名称&#xff1a;18:0 PE Fluorescein 英文别称&#xff1a;DSPE-FITC 外观&#xff1a…

开发人员的绝佳生产力工具

介绍 从长远来看&#xff0c;每天工作 8 小时对您没有帮助&#xff0c;但利用这些来最大化产出肯定会让您受益。这就是为什么生产力是最重要的事情之一。 今天&#xff0c;我们将学习一些很棒的工具&#xff0c;它们可以提高您的工作效率。除非并且直到您将这些工具集成到您的…

【Lilishop商城】No3-7.模块详细设计,订单模块-1(购物车、收银台)的详细设计

仅涉及后端&#xff0c;全部目录看顶部专栏&#xff0c;代码、文档、接口路径在&#xff1a; 【Lilishop商城】记录一下B2B2C商城系统学习笔记~_清晨敲代码的博客-CSDN博客 全篇会结合业务介绍重点设计逻辑&#xff0c;其中重点包括接口类、业务类&#xff0c;具体的结合源代…

【TECH SCIENCE PRESS出版社】2区SCI,仅3个月左右录用,数字孪生、绿色技术、供应链、人工智能物联网、智能传感器相关领域均可

【出版社】TECH SCIENCE PRESS 【期刊简介】IF&#xff1a;3.5-4.0&#xff0c;JCR2区&#xff0c;中科院3区 【检索情况】SCI&EI双检&#xff0c;正刊 【参考周期】3个月左右 【征稿领域】 ①数字孪生在智能医疗系统中的应用&#xff08;2023.3.25截稿&#xff09; …

NetInside助力IT提高业务性能管理能力(一)

需求简介 某外高桥公司的OA系统是其重要的业务系统&#xff0c;OA系统负责人表示&#xff0c;部分用户反馈&#xff0c;访问OA系统时比较慢。需要通过分析系统看一下实际情况。 信息部已对企业领导定义了独立的组&#xff0c;本次要主动分析领导们的使用体验快慢。如果OA系统…

一个带详细程序和注释的实例,手把手带你学会用BP神经网络做预测

目录 1.问题描述 1.1问题剖析 2.实现程序 2.1运行结果 2.3总结 3.预测 3.1输出结果 4.预测理解 1.问题描述 某运输系统连续9年货运量的有关数据如表2-10所示。根据对关于货运量影响因素的分析&#xff0c;这里分别取国内生产总值GDP、工业总产值、铁路运输线路长度、复线…

使用vue-easytable实现仿excel表格,支持可编辑、添加删除行、虚拟表格等功能

使用npm安装vue-easytable npm install --save vue-easytable 在 main.js 中写入以下内容&#xff1a; // 引入样式 import "vue-easytable/libs/theme-default/index.css"; // 引入组件库 import VueEasytable from "vue-easytable"; Vue.use(VueEasyt…

ADI Blackfin DSP处理器-BF533的开发详解49:图像处理专题-Bright (图像亮暗处理)(含源码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 代码实现了图像亮暗处理&#xff0c;代码运行时&#xff0c;会通过文件系统打开工程文件根目下" …/ImageView"路径中的 tes…

[附源码]Node.js计算机毕业设计电子市场计算机配件报价系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

聚焦人机交互智能应用领域,APISIX 在希沃网关的应用与实践

分享嘉宾简海清&#xff0c;视源股份运维负责人。 视源股份&#xff08;CVTE&#xff09;自成立以来&#xff0c;依托在音视频技术、人机交互、应用开发、系统集成等电子产品领域的软硬件技术积累&#xff0c;建立了教育数字化工具及服务提供商希沃&#xff08;seewo&#xff0…

三、JavaScript——编写位置

1.在script标签内编写 JS的代码一般可以写到script标签中&#xff0c;script标签的完整写法是要加type"text/javascript",但这个一般可以省略&#xff0c;所以只用<script>即可 <!DOCTYPE html> <html lang"en"> <head><meta …

【架构师李肯】带你走进架构师的一天

作者简介 *架构师李肯&#xff08;全网同名&#xff09;**&#xff0c;一个专注于嵌入式IoT领域的架构师。有着近10年的嵌入式一线开发经验&#xff0c;深耕IoT领域多年&#xff0c;熟知IoT领域的业务发展&#xff0c;深度掌握IoT领域的相关技术栈&#xff0c;包括但不限于主流…