首页 > 其他分享 >颠倒

颠倒

时间:2023-04-17 12:55:21浏览次数:31  
标签:scale 定义 缩放 颠倒 图像 VDMA define

点击查看代码
#include "xaxivdma.h" // 引入Xilinx提供的VDMA驱动库 
#include "xaxivdma_i.h"
#include "sleep.h" // 引入Xilinx提供的延时函数库
#include "ff.h" // 引入FatFs文件系统库

#define DDR_BASEADDR        0x00000000 // 定义DDR存储器的起始地址
#define VDMA_BASEADDR       XPAR_AXI_VDMA_0_BASEADDR // 定义VDMA模块的基地址
#define H_STRIDE            800 // 定义图像水平方向的跨度(即一行像素所占的字节数)
#define H_ACTIVE            800 // 定义图像水平方向的分辨率
#define V_ACTIVE            480 // 定义图像垂直方向的分辨率
#define COUNTS_PER_SECOND   (XPAR_CPU_CORTEXA9_CORE_CLOCK_FREQ_HZ)/64 // 定义每秒钟的计数数目

#define VIDEO_LENGTH  (H_STRIDE*V_ACTIVE) // 定义视频数据的长度(以字节为单位)
#define VDMA_MM2S_START DDR_BASEADDR + 0x2000000 // 定义VDMA偏移量,用于指定VDMA接收数据的存储地址

static FATFS fatfs; // 定义FatFs文件系统对象
u8 picture[800*480*3]={0}; // 定义图像数据缓冲区大小(尺寸为800x480,并且每个像素由RGB三个分量组成)
u8 picture_reverse[800*480*3]={0}; // 定义反转后的图像数据缓冲区

void Xil_DCacheFlush(void); // 声明函数Xil_DCacheFlush,用于刷新CPU高速缓存

// 显示图像的函数,参数disp_base_addr为显示窗口的起始地址,addr为待显示图像的首地址,size_x和size_y为图像的分辨率,scale_x和scale_y为缩放比例,mode为缩放方式(1表示垂直方向缩放,2表示水平方向缩放,0表示不缩放)
void show_img(u8 *disp_base_addr, u8 *addr, u32 size_x, u32 size_y, u32 scale_x, u32 scale_y, u8 mode)
{
    u32 i, j, k, l;
    for(j=0;j<size_y/scale_y;j++) // 遍历行
    {
        for(i=0;i<size_x/scale_x;i++) // 遍历列
        {
            if (mode == 1) { // 如果是垂直方向缩放
                u32 r = 0, g = 0, b = 0;
                for(k=0;k<scale_x;k++) {
                    for(l=0;l<scale_y;l++) {
                        r += *(addr+((i*scale_x+k)+(j*scale_y+l)*size_x)*3+0); // 累加红色分量
                        g += *(addr+((i*scale_x+k)+(j*scale_y+l)*size_x)*3+1); // 累加绿色分量
                        b += *(addr+((i*scale_x+k)+(j*scale_y+l)*size_x)*3+2); // 累加蓝色分量
                    }
                }
                *(disp_base_addr+(i+j*size_x/scale_x)*3+0) = r/(scale_x*scale_y); // 计算平均值并存储到显示窗口对应位置的缓冲区中(红色)
                *(disp_base_addr+(i+j*size_x/scale_x)*3+1) = g/(scale_x*scale_y); // (绿色)
                *(disp_base_addr+(i+j*size_x/scale_x)*3+2) = b/(scale_x*scale_y); // (蓝色)
            } else if (mode == 2) { // 如果是水平方向缩放
                for(l = 0; l < scale_y; l++) {
                    for(k = 0; k < scale_x; k++) {
                        u8 r = *(addr+((i*scale_x+k)+(j*scale_y+l)*size_x)*3+0); // 取出原始图像的RGB三个分量
                        u8 g = *(addr+((i*scale_x+k)+(j*scale_y+l)*size_x)*3+1);
                        u8 b = *(addr+((i*scale_x+k)+(j*scale_y+l)*size_x)*3+2);

                        // 将RGB颜色值转换为灰度值
                        u8 gray = (u8)(0.2989 * r + 0.5870 * g + 0.1140 * b);

                        // 对灰度值进行阈值化处理(如果大于等于128,则置为白色255,否则置为黑色0)
                        u8 binary = (gray >= 128) ? 255 : 0;

                        *(disp_base_addr+((i*scale_x)+k + ((j*scale_y)+l)*size_x*scale_x)*3+0) = binary; // 存储到显示窗

标签:scale,定义,缩放,颠倒,图像,VDMA,define
From: https://www.cnblogs.com/love-dog/p/17325504.html

相关文章

  • 【leetcode】颠倒二进制位
    颠倒给定的32位无符号整数的二进制位。 示例1:输入:00000010100101000001111010011100输出:00111001011110000010100101000000解释:输入的二进制串00000010100101......
  • 算法刷题-数字颠倒-JAVA
    0x00引言为获取一个良好的算法思维,以及不再成为一个脚本小子,争取每天一道算法题,培养自己的逻辑思维,温顾各类型语言语法知识。题解只写自己理解的解法,其他解法不再增加。......
  • LeetCode刷题(46)~颠倒二进制位【循环/分治】
    题目描述颠倒给定的32位无符号整数的二进制位。示例1:输入:00000010100101000001111010011100输出:00111001011110000010100101000000解释:输入的二进制串0000......
  • 【算法】最后一个单词的长度,颠倒二进制位,排列序列等三道题目
    颠倒二进制位题目描述颠倒给定的32位无符号整数的二进制位。提示:请注意,在某些语言(如Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并......
  • 【华为OJ11】数字颠倒
    题目描述描述:输入一个整数,将这个整数以字符串的形式逆序输出程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001输入描述:输入一个int整数......
  • 190. 颠倒二进制位 (二进制数字反转)
    难度简单551收藏分享切换为英文接收动态反馈颠倒给定的32位无符号整数的二进制位。提示:请注意,在某些语言(如Java)中,没有无符号整数类型。在这种情况下,输入和输出都......