ADI Blackfin DSP处理器-BF533的开发详解39:图像处理专题-图像灰度均衡处理(含源码)

news2024/11/17 7:26:38

硬件准备

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

软件准备

Visual DSP++软件

硬件链接

在这里插入图片描述

功能介绍

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

代码使用说明

funct.c 中的 GrayEqualize(const BMPIMAGE* img) 该函数是将读取的图像进行灰度均衡处理。

BMPIMAGE * 图像结构体指针

在 main.c 文件中定义了一个#define LCD_VIEW_ENABLE 宏开关,如果不需要将处理后的图片显示在液晶屏上,只需将这个宏开关注释掉。

代码调试步骤

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

代码调试结果

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

程序源码

bmp.c

#include<stdio.h>
#include “bmp.h”

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

  • 函数名 : OpenBmpFile
  • 函数功能 : 以二进制形式打开计算机硬盘BMP图像文件
  • 函数参数 : const char * 图像文件名称
  •   			BMPIMAGE *			  图像结构体指针
    
  • 函数返回值 :FALSE 打开图像文件失败
  •   			TRUE	打开图像文件成功
    

/
int OpenBmpFile(const char
filename, BMPIMAGE
img) {
if((img->bmpfile = fopen(filename, “rb”)) == NULL)
{
printf(“open file is Failure\n\r”);
return FALSE;
}
return TRUE;
}
/
**

  • 函数名 : writeBmpFile
  • 函数功能 : 将二进制图像数据保存到计算机硬盘中
  • 函数参数 : const char * 图像文件名称
  •   			BMPIMAGE *			  图像结构体指针
    
  • 函数返回值 :FALSE 保存图像文件失败
  •   			TRUE	保存图像文件成功
    

******************************************************/
int writeBmpFile(const char
filename,const BMPIMAGE
img) {

FILE *fp;
unsigned int i,j;
unsigned char tempData, *pData;
unsigned int tempHeight;
unsigned int tempWidth;
tempHeight = img->infohead.BiHeight>>1;
tempWidth = img->infohead.BiWidth*3;
pData = img->imgbuf;
for(i = 0; i < img->imagesize; i = i + 3) {
	tempData = pData[i];
	pData[i] = pData[i + 2];
	pData[i + 2] = tempData;
}

for(i=0;i<tempHeight;i++)
{
	for(j=0;j<tempWidth;j++)
	{
		tempData = pData[(img->infohead.BiHeight-1-i)*tempWidth+j];
		pData[(img->infohead.BiHeight-1-i)*tempWidth+j] = pData[i*tempWidth+j];
		pData[i*tempWidth+j] = tempData;
	}
}

if((fp = fopen(filename, "wb")) == NULL)
{
	printf("seek file is Failure\n\r");
	return FALSE;
}	
fwrite(&img->filehead, 1, 2, fp);
fwrite(&img->filehead.bfSize, 1, 12, fp);
fwrite(&img->infohead, 1, 40, fp);
fwrite(img->imgbuf, 1, img->imagesize, fp);
fclose(fp);
fclose(img->bmpfile);
return TRUE;

}
/********************************************************

  • 函数名 : GetBmpHeader
  • 函数功能 : 读取BMP文件头
  • 函数参数 : BMPIMAGE * 图像结构体指针
  • 函数返回值 :FALSE 读取BMP文件头失败
  •   			TRUE	读取BMP文件头成功
    

*******************************************************/
int GetBmpHeader(BMPIMAGE
img) {
unsigned char headbuffer[INFOHEADSIZE];
BMPFILEHEAD filehead = &img->filehead;
BMPINFOHEAD infohead = &img->infohead;
if (fread(headbuffer, 1, FILEHEADSIZE, img->bmpfile) != FILEHEADSIZE) {
return FALSE;
}
img->filehead.bfType[0] = headbuffer[0];
img->filehead.bfType[1] = headbuffer[1];
if (
(unsigned short )&filehead->bfType[0] != (0x4D42)) { / ‘BM’ /
printf(“file is not bmp\n\r”);
return FALSE; /
not bmp image
/
}
memcpy(&filehead->bfSize, &headbuffer[2], 4);
memcpy(&filehead->bfOffBits, &headbuffer[10], 4);
if(fseek(img->bmpfile, FILEHEADSIZE, SEEK_SET)) {
return FALSE;
}
if (fread(headbuffer, 1, INFOHEADSIZE, img->bmpfile) != INFOHEADSIZE) {
return FALSE;
}
memcpy(&infohead->BiSize, &headbuffer[0], 4);
memcpy(&infohead->BiWidth, &headbuffer[4], 4);
memcpy(&infohead->BiHeight, &headbuffer[8], 4);
memcpy(&infohead->BiPlanes, &headbuffer[12], 2);
memcpy(&infohead->BiBitCount, &headbuffer[14], 2);
memcpy(&infohead->BiCompression, &headbuffer[16], 4);
memcpy(&infohead->BiSizeImage, &headbuffer[20], 4);
memcpy(&infohead->BiXpelsPerMeter, &headbuffer[24], 4);
memcpy(&infohead->BiYpelsPerMeter, &headbuffer[28], 4);
memcpy(&infohead->BiClrUsed, &headbuffer[32], 4);
memcpy(&infohead->BiClrImportant, &headbuffer[36], 4);
if(infohead->BiPlanes != 1) {
return FALSE;
}
if(infohead->BiBitCount !=24) {
return FALSE;
}
if(infohead->BiCompression != BI_RGB) {
return FALSE;
}
GetImageSize(img);
return TRUE;
}

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

  • 函数名 : GetImageSize
  • 函数功能 : 获取BMP文件大小
  • 函数参数 : BMPIMAGE * 图像结构体指针
  • 函数返回值 :void
    ********************************************************/
    void GetImageSize(BMPIMAGE *img) {
    img->imagesize = img->infohead.BiHeight * WIDTHBYTES(img->infohead.BiWidth * img->infohead.BiBitCount);
    }

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

  • 函数名 : ReadBMPData
  • 函数功能 : 读取BMP数据缓冲区
  • 函数参数 : BMPIMAGE * 图像结构体指针
  • 函数返回值 :FALSE 读取BMP数据失败
  •   			TRUE	读取BMP数据成功
    

*******************************************************/
int ReadBMPData(const BMPIMAGE
img) {
unsigned int pitch = WIDTHBYTES(img->infohead.BiWidth * img->infohead.BiBitCount);
unsigned int readnum = 0;
int i, j, k;
unsigned char m_temp;
unsigned char *p_tmp, *p_tmp_cur;
unsigned char tempData, pData;
unsigned int index_data;
pData = img->imgbuf;
if(fseek(img->bmpfile, img->filehead.bfOffBits, SEEK_SET)) {
return FALSE;
}
p_tmp = NULL;
p_tmp = (unsigned char )malloc(pitch * img->infohead.BiHeight);
if(p_tmp != NULL) {
readnum = fread(p_tmp, 1, pitch * img->infohead.BiHeight, img->bmpfile);
p_tmp_cur = p_tmp;
for(i = img->infohead.BiHeight - 1; i >= 0; i–, p_tmp_cur += pitch) {
memcpy(&img->imgbuf[i
pitch], p_tmp_cur, pitch);
}
}
else {
for(i = img->infohead.BiHeight - 1; i >= 0; i–) {
readnum += fread(&img->imgbuf[i
pitch], 1, pitch, img->bmpfile);
}
}
for(index_data = 0; index_data < img->imagesize; index_data = index_data + 3) {
tempData = pData[index_data];
pData[index_data] = pData[index_data + 2];
pData[index_data + 2] = tempData;
}
if(p_tmp != NULL) {
free(p_tmp);
}
return (readnum == img->imagesize);
}

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

  • 函数名 : Allocbuf
  • 函数功能 : 分配图像缓冲区
  • 函数参数 : BMPIMAGE * 图像结构体指针
  • 函数返回值 :FALSE 分配图像缓冲区失败
  •   			TRUE	分配图像缓冲区成功
    

/
int Allocbuf(BMPIMAGE
img) {
if((img->imgbuf = malloc(img->imagesize)) == NULL)
return FALSE;
return TRUE;
}
/
*

  • 函数名 : Freebuf
  • 函数功能 : 释放图像缓冲区
  • 函数参数 : BMPIMAGE * 图像结构体指针
  • 函数返回值 :void
    *******************************************************/
    void Freebuf(BMPIMAGE
    img) {
    if(img->imgbuf != NULL)
    free(img->imgbuf);
    img->imgbuf = NULL;
    }

cpu.c

#include <cdefBF533.h>
#include “cpu.h”

void Init_Timers0(int dat)
{
*pTIMER0_CONFIG = 0x0019;
*pTIMER0_WIDTH = dat;
*pTIMER0_PERIOD = 2000;
}

void Enable_Timers0(void)
{
*pTIMER_ENABLE|= 0x0001;
asm(“ssync;”);
}

void Disable_Timers0(void)
{
*pTIMER_DISABLE |= 0x0001;
}

void Set_PLL(int pmsel,int pssel)
{
int new_PLL_CTL;
*pPLL_DIV = pssel;
asm(“ssync;”);
new_PLL_CTL = (pmsel & 0x3f) << 9;
*pSIC_IWR |= 0xffffffff;
if (new_PLL_CTL != *pPLL_CTL)
{
*pPLL_CTL = new_PLL_CTL;
asm(“ssync;”);
asm(“idle;”);
}
}

void Init_SDRAM(void)
{
*pEBIU_SDRRC = 0x00000817;
*pEBIU_SDBCTL = 0x00000013;
*pEBIU_SDGCTL = 0x0091998d;
ssync();
}

void Init_EBIU(void)
{
*pEBIU_AMBCTL0 = 0x7bb07bb0;
*pEBIU_AMBCTL1 = 0x7bb07bb0;
*pEBIU_AMGCTL = 0x000f;
}

funct.c

#include “bmp.h”

static void GetIntensity(unsigned char* lpDIBBits,float* fPs_R,float* fPs_G,float* fPs_B,int lWidth,int lHeight)
{
long i;
long j;
int nNs_R[256];
int nNs_G[256];
int nNs_B[256];
long lLineBytes=WIDTHBYTES(lWidth24);
memset(nNs_R,0,sizeof(nNs_R));
memset(nNs_G,0,sizeof(nNs_G));
memset(nNs_B,0,sizeof(nNs_B));
for(i=0;i<lHeight;i++)
{
unsigned char r,g,b;
for(j=0;j<lLineBytes;j++)
{
r = (lpDIBBits+lLineBytesi+j);
nNs_R[r]++;
j++;
g = (lpDIBBits+lLineBytesi+j);
nNs_G[r]++;
j++;
b = (lpDIBBits+lLineBytesi+j);
nNs_B[b]++;
}
}
for(i=0;i<256;i++)
{
fPs_R[i]=nNs_R[i]/(lHeight
lWidth1.0f);
fPs_G[i]=nNs_G[i]/(lHeight
lWidth1.0f);
fPs_B[i]=nNs_B[i]/(lHeight
lWidth*1.0f);
}
}

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

  • 函数名 : GrayEqualize
  • 函数功能 : 图像灰度均衡处理
  • 函数参数 : BMPIMAGE * 图像结构体指针
  • 函数返回值 :FALSE 处理失败
  •   			TRUE	处理成功
    

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

int GrayEqualize(const BMPIMAGE* img)
{
unsigned char* lpDIBBits = img->imgbuf;
int lWidth = img->infohead.BiWidth;
int lHeight = img->infohead.BiHeight;
long i;
long j;
long lLineBytes=WIDTHBYTES(lWidth*24);

//灰度分布密度
float fPs_R[256];
float fPs_G[256];
float fPs_B[256];
//中间变量
float temp_r[256];
float temp_g[256];
float temp_b[256];

int nNs_R[256];
int nNs_G[256];
int nNs_B[256];
//初始化
memset(temp_r,0,sizeof(temp_r));
memset(temp_g,0,sizeof(temp_g));
memset(temp_b,0,sizeof(temp_b));
//获得图像的灰度分布密度
GetIntensity(lpDIBBits,fPs_R,fPs_G,fPs_B,lWidth,lHeight);
for(i=0;i<256;i++)
{
	if(i==0)
	{
		temp_r[0]=fPs_R[0];
		temp_g[0]=fPs_G[0];
		temp_b[0]=fPs_B[0];
	}
	else
	{
		temp_r[i]=temp_r[i-1]+fPs_R[i];
		temp_g[i]=temp_g[i-1]+fPs_G[i];
		temp_b[i]=temp_b[i-1]+fPs_B[i];
	}
	nNs_R[i]=(int)(225.0f*temp_r[i]+0.5f);
	nNs_G[i]=(int)(225.0f*temp_g[i]+0.5f);
	nNs_B[i]=(int)(225.0f*temp_b[i]+0.5f);
}
for(i=0;i<lHeight;i++)
{
	unsigned char r,g,b;
	for(j=0;j<lLineBytes;j++)
	{
		r=*(lpDIBBits+lLineBytes*i+j);
		*(lpDIBBits+lLineBytes*i+j) = nNs_R[r];
		j++;
		g=*(lpDIBBits+lLineBytes*i+j);
		*(lpDIBBits+lLineBytes*i+j) = nNs_G[g];
		j++;
		b=*(lpDIBBits+lLineBytes*i+j);
		*(lpDIBBits+lLineBytes*i+j) = nNs_B[b];
	}
}
return TRUE;

}

main.c

#include <cdefBF533.h>
#include “cpu.h”
#include “tftlcd.h”
#include “bmp.h”
#include “funct.h”

#define INFILEADDR “…/ImageView/testin.bmp”
#define OUTFILEADDR “…/ImageView/testout.bmp”
#define LCD_VIEW_ENABLE

int main(void)
{
BMPIMAGE bmpimage;
Set_PLL(16,4);
Init_EBIU();
Init_SDRAM();
LCDBK_Disable();
if(!OpenBmpFile(INFILEADDR,&bmpimage))
return FALSE;
if(!GetBmpHeader(&bmpimage))
return FALSE;
if(!Allocbuf(&bmpimage))
return FALSE;
if(!ReadBMPData(&bmpimage))
return FALSE;

/* 图像灰度均衡处理		*/
if(!GrayEqualize(&bmpimage))
	return FALSE;	

#ifdef LCD_VIEW_ENABLE
Enable_Timers0();
RGB888_RGB565(&bmpimage,(void*)DisplayBuffer_565);
#endif

if(!writeBmpFile(OUTFILEADDR,&bmpimage))
	return FALSE;

#ifdef LCD_VIEW_ENABLE
InitDMA();
InitPPI();
InitTimer();
PPI_TMR_DMA_Enable();
LCD_Enable();
LCDBK_Enable();
Init_Timers0(1999);//1~1999 控制背光亮度
Enable_Timers0();
while(1);
#endif
}

tftlcd.c

#include <cdefBF533.h>
#include “tftlcd.h”
#include “cpu.h”

section(“sdram0_bank1”) unsigned char DisplayBuffer_565[272][1440] ;

void InitDMA(void)
{
int addr;
addr = &DisplayBuffer_565;
addr -= 1920;
*pDMA0_START_ADDR = addr;

*pDMA0_X_COUNT = 480;
*pDMA0_X_MODIFY = 2;
*pDMA0_Y_COUNT = 286;
*pDMA0_Y_MODIFY = 2;	
*pDMA0_CONFIG = 0x1034;

}

void InitPPI(void)
{
*pPPI_CONTROL = 0x781e;
*pPPI_DELAY = 0;
*pPPI_COUNT = 479;
*pPPI_FRAME = 286;
}

void InitTimer(void)
{
*pTIMER1_PERIOD = 525;
*pTIMER1_WIDTH = 41;
*pTIMER1_CONFIG = 0x00a9;
*pTIMER2_PERIOD = 150150;
*pTIMER2_WIDTH = 5250;
*pTIMER2_CONFIG = 0x00a9;
}

void PPI_TMR_DMA_Enable(void)
{
*pDMA0_CONFIG |= 0x1;
asm(“ssync;”);
InitTimer();
*pPPI_CONTROL |= 0x1;
asm(“ssync;”);
*pTIMER_ENABLE|= 0x0006;
asm(“ssync;”);
}

void PPI_TMR_DMAR_Disable(void)
{
*pDMA0_CONFIG &= (~0x1);
*pPPI_CONTROL &= (~0x1);
}

void RGB888_RGB565( BMPIMAGE* img, unsigned char *dst)
{
int i = 0;
int j = 0;

if (img->imagesize % 3 != 0)
{
    return;
}
for (i = 0; i < img->imagesize; i += 3)
{
     dst[j+1] = img->imgbuf[i+2] &0xf8; 			//B 
     dst[j+1] |= ((img->imgbuf[i+1]>>5) & 0x07);	//GH
     dst[j] = ((img->imgbuf[i+1]<<3) & 0xe0);  		//GL  
     dst[j] |= ((img->imgbuf[i]>>3) &0x1f); 		//R
    j += 2;  
    
}

}

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

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

相关文章

ADI Blackfin DSP处理器-BF533的开发详解37:图像处理专题-YUV420 转 RGB565(含源代码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 代码实现了将 YUV420 数据格式转为 RGB565 格式。YUV420 的数据格式必须是两度和色度分离的。 板卡液晶屏和 VDSP 软件商 Image Viewe…

【小甲鱼C语言】课后笔记第一章第三节——常量和宏定义

目录 1、常见的常量 2、宏定义&#xff08;符号常量&#xff09; 3、标识符 4、字符串常量 5、课后习题&#xff08;编程题&#xff09; 1、常见的常量 整型常量&#xff1a;520, 1314, 123 实型常量&#xff1a;3.14, 5.12, 8.97 字符常量 普通字符&#xff1a;L, o, v,…

基于短期的风力发电概率预测(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清…

Stm32旧版库函数5——ov2640通过nrf24l01发送图像

视频采集端&#xff1a; /******************************************************************************* // // 使用单片机STM32F100C8T6 8 // 晶振&#xff1a;8.00M // 编译环境 Keil uVision4 // 在3.3V的供电环境下&#xff0c;就能运行 // 波特率 115200 // 使…

PyTorch(六)网络模型

文章目录Log一、现有网络模型的使用及修改1. VGG① ImageNet 数据集下载② 模型加载③ 模型改造a. 添加一个线性层b. 插入一个线性层c. 修改一个线性层二、网络模型的保存与读取① 网络模型的保存a. 保存方式一b. 保存方式二② 网络模型的读取a. 读取方式一b. 读取方式二三、完…

微信公众号服务号配置对接在线客服系统教程

如果只需要实现微信公众号的关注自动回复&#xff0c;关键词自动回复功能&#xff0c;普通订阅号就可以 当需要对接实现公众号的模板消息提醒&#xff0c;模板消息与客服端H5的对接&#xff0c;访客在微信点击或扫码时获取到微信的昵称头像&#xff0c;需要网页授权功能。这种是…

Spring(一):Spring核心与设计思想(IoC、DI)

目录一、Spring是什么1.1 容器是什么&#xff1f;1.2 什么是IoC&#xff1f;1.3 理解Spring IoC1.4 DI是什么一、Spring是什么 我们这里所说的Spring指的是SpringFrameWork&#xff0c;是一个开源框架。Spring支持广泛的应用场景&#xff0c;它可以让Java企业级的应用程序开发…

k8s编程operator实战之云编码平台——②controller初步实现

文章目录1、工作空间镜像制作2、controller实现2.1 使用kubebuilder创建工程2.2 代码实现2.2.1 引入grpc2.2.2 实现CloudIdeServiceStatusInformer的实现CloudSpaceService定义方法CreateSpaceAndWaitForRunning方法GetPodSpaceInfo方法DeleteSpace方法GetPodSpaceStatus2.2.3 …

人才盘点的工具与方法有哪些?怎样做好人才盘点?

人才盘点是对组织和人才进行系统管理的一种流程。在此过程中&#xff0c;对组织架构、人员配比、人才绩效、关键岗位的继任计划、关键人才发展、关键岗位的招聘及关键人才的晋升和激励进行深入讨论&#xff0c;并制定详细的组织行动计划&#xff0c;确保组织以更加优化的结构和…

非零基础自学计算机操作系统 第1章 操作系统概述 1.5 操作系统的硬件环境 1.5.1 定时装置 1.5.2 堆与栈 1.5.3 寄存器

非零基础自学计算机操作系统 文章目录非零基础自学计算机操作系统第1章 操作系统概述1.5 操作系统的硬件环境1.5.1 定时装置1.5.2 堆与栈1.5.3 寄存器第1章 操作系统概述 1.5 操作系统的硬件环境 构建一个高效、可靠的操作系统&#xff0c;硬件需要提供哪些支持&#xff1f; 1…

MySQL数据库基本使用(一)-------登录及查看基本信息

1.MySQL登录命令 格式如下&#xff1a; mysql -h 主机名 -P 端口号 -u 用户名 -p密码例如&#xff1a; mysql -h localhost -P 3306 -u root -pabc123 # 这里我设置的root用户的密码是abc123注意&#xff1a; -p与密码之间不能有空格&#xff0c;其他参数名与参数值之间可以…

Spring Boot启动原理源码

Spring Boot启动原理源码 注意:这个springboot启动源码和springboot自动配置原理的源码是十分重要的,面试的时候要是问springboot,一般都会问这两个。 源码&#xff1a; SpringBoot 事假监听器发布顺序&#xff1a; 1.ApplicationStartingEvent 2.ApplicationEnvironmentPrepa…

springboot+mybatis配置多数据源实战

1.背景说明 2.配置多数据源步骤 2.1 项目结构变更 2.2 添加配置类 2.3 修改配置文件数据连接配置信息 1.背景说明一般一个项目中只会连接一个数据库.但是随着需求变更,会要求同一个项目中连接多个数据库,本文就讲一下如何在一个项目中对多…

usaco training刷怪旅 第一层第二题 Greedy Gift Givers

usaco training 关注我持续创作training题解 翻译有点奇葩&#xff0c;我就上原题目了&#xff0c;各位自己翻译吧QwQ A group of NP (2 ≤ NP ≤ 10) uniquely named friends has decided to exchange gifts of money. Each of these friends might or might not give some m…

一种基于PCI总线的反射内存卡设计

一种基于PCI总线的反射内存卡设计 摘要&#xff1a; 对实时传输&#xff0c; 传统的以太网络由于传输协议开销的不确定性&#xff0c; 很难满足实时网络的要求&#xff0c; 实时网络是一种应用于高实时性要求的专用网络通信技术&#xff0c; 一般采用基于高速网络的共享存储器…

Python爬虫实战,requests+openpyxl模块,爬取小说数据并保存txt文档(附源码)

前言 今天给大家介绍的是Python爬取小说数据并保存txt文档&#xff0c;在这里给需要的小伙伴们代码&#xff0c;并且给出一点小心得。 首先是爬取之前应该尽可能伪装成浏览器而不被识别出来是爬虫&#xff0c;基本的是加请求头&#xff0c;但是这样的纯文本数据爬取的人会很多…

web网页设计与开发:基于HTML+CSS+JavaScript简单的个人博客网页制作期末作业

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

怎么让文字转换成语音?一步一步让你学会

在日常的生活中&#xff0c;我们经常会需要将文字转换成语音的情况&#xff0c;例如广告词、给文本配音等等&#xff0c;当然我们就简单的方法就是自己手动进行配音&#xff0c;但是如果没有专业的设备和配音环境&#xff0c;是很难配出很好的效果的&#xff0c;这该怎么办呢&a…

飞链云智能机器人-基于ChatGPT的有趣问答

最近ChatGPT火起来了&#xff1b; 可玩性很高&#xff0c;不亚于之前AI绘画的视觉冲击&#xff1b;这次ChatGPT带来的是逻辑冲击&#xff1b;上下文逻辑远超现有市面上其他所有的AI对话机器人&#xff1b; 有人用技巧训练ChatGPT&#xff0c;ChatGPT机器人宣言要毁灭人类&…

备战2023蓝桥国赛-传纸条

题目描述&#xff1a; 解析&#xff1a; 这道题想了我好久&#xff0c;一开始我是想假如只走一条路线&#xff0c;从(1,1)走到&#xff08;m,n&#xff09;&#xff0c;这种问题该怎么解决呢&#xff1f;针对这种问题我是设了dp[k][i][j]表示走了k步到达(i,j)的好心程度之和的…