完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
一:串口传输练习
1:实验目的 将两台笔记本电脑,借助 u***转rs232 模块和杜邦线,建立起串口连接。然后用串口助手等工具软件(带文件传输功能)将一台笔记本上的一个大文件(图片、视频和压缩包软件)传输到另外一台电脑,预算文件大小、波特率和传输时间三者之间的关系,并对比实际传输时间。 2:实验器材 两台电脑(这里与@狗都不写系列共同完成); 杜邦线若干; TTL转USB串口两个; 3:连接注意 1.两条线的TXD与RXD反接; 2.两者连接的电压应该相同。 4:结果 文件大小为13245; 波特率为115200bps 预计时间为:11.51s 实际时间为:12s 结论:传输时有时延 二:点阵汉字的字模读取与显示 1.基本知识 (1)机内码 机内码是汉字在计算机内部使用的代码,就好像是汉字代号,方便计算机识别储存。 国内使用最多的其实是国标码,两者转化关系:机内码是将国标码的每个字节都加上128,即将两个字节的最高位由0改1。 (2)区位码编码规则 GB2312就像一个仓库,共收录6763个汉字,其中一级汉字3755个,二级汉字3008个。就像仓库储存东西会分门别类放置。GB2312对所收汉字进行了“分区”处理,每区含有94个汉字/符号; 这样的分区放置被称为区位码; 储存规则:01-09区为特殊符号10-15区为用户自定义符号区(未编码)16-55区为一级汉字,按拼音排序56-87区为二级汉字,按部首/笔画排序88-94区为用户自定义汉字区(未编码); 2字节编码,高位为0xA1-0xF7,低位为0xA1-0xFE 汉字区域,高位为0xB0-0xF7,低位为0xA1-0xFE 特殊符号,高位为0xA1-0xA9,低位为0xA1-0xFE 国标码 = 区位码 + 2020H; 机内码 = 国标码 + 8080H; (3)字形数据存储格式 正如在仓库储存东西,会有箱装、听装、盒装、袋装的形式。汉字在电脑中储存也是有一定格式的,下面我们会初步去了解它的格式。 Ⅰ.点阵字库储存 汉字在电脑中是属于图形。 所以每个字节的每个位都代表一个汉字的一个点,每个汉字都是由一个矩形的点阵组成,0代表没有,1代表有点,将0和1分别用不同颜色画出,就形成了一个汉字。 这样的存储称为点阵字库存储。 常用的点阵字库存储有1212, 1414, 16*16三种字库。 Ⅱ.16*16点阵字库 这里介绍一种基础字库: 对于1616的矩阵来说,它所需要的位数共是1616=256个位,每个字节为8位,因此,每个汉字都需要用256/8=32个字节来表示。 即每两个字节代表一行的16个点,共需要16行,显示汉字时,只需一次性读取32个字节,并将每两个字节为一行打印出来,即可形成一个汉字。 2.Ubuntu下调用opencv库编程显示图片和学号姓名 创建一个文件夹test里面放一张照片1.jpg、ASCio816.***、HZKf2424.hz 自己创建一个logo.txt 代码: #include #include #include"opencv2/opencv.hpp" #include #include #include using namespace cv; using namespace std; void paint_chinese(Mat& image,int x_offset,int y_offset,unsigned long offset); void paint_ascii(Mat& image,int x_offset,int y_offset,unsigned long offset); void put_text_to_image(int x_offset,int y_offset,String image_path,char* logo_path); int main(){ String image_path="/home/test/1.jpg"; char* logo_path=(char*)"/home/test/logo.txt"; put_text_to_image(450,750,image_path,logo_path);//安排文字从图片像素坐标(450,750)开始显示 return 0; } //在图片上绘制文字的起点坐标 void paint_ascii(Mat& image,int x_offset,int y_offset,unsigned long offset){ Point p; p.x = x_offset; p.y = y_offset; //存放ascii字膜 char buff[16]; //打开ascii字库文件 FILE *ASCII; if ((ASCII = fopen("/home/test/Asci0816.***", "rb")) == NULL){ printf("Can't open ascii.***,Please check the path!"); //getch(); exit(0); } fseek(ASCII, offset, SEEK_SET); fread(buff, 16, 1, ASCII); int i, j; Point p1 = p; for (i = 0; i<16; i++) //十六个char { p.x = x_offset; for (j = 0; j < 8; j++) //一个char八个bit { p1 = p; if (buff & (0x80 >> j)) /*测试当前位是否为1*/ { /* 由于原本ascii字膜是8*16的,不够大, 所以原本的一个像素点用4个像素点替换, 替换后就有16*32个像素点 ps:感觉这样写代码多余了,但目前暂时只想到了这种方法 */ circle(image, p1, 0, Scalar(0, 0, 255), -1); p1.x++; circle(image, p1, 0, Scalar(0, 0, 255), -1); p1.y++; circle(image, p1, 0, Scalar(0, 0, 255), -1); p1.x--; circle(image, p1, 0, Scalar(0, 0, 255), -1); } p.x+=2; //原来的一个像素点变为四个像素点,所以x和y都应该+2 } p.y+=2; } } //在图片替换像素点 void paint_chinese(Mat& image,int x_offset,int y_offset,unsigned long offset){ Point p; p.x=x_offset; p.y=y_offset; FILE *HZK; char buff[72];//72个字节,用来存放汉字的 if((HZK=fopen("/home/test/HZKf2424.hz","rb"))==NULL){ printf("Can't open HZKf2424.hz,Please check the path!"); exit(0);//退出 } fseek(HZK, offset, SEEK_SET);/*将文件指针移动到偏移量的位置*/ fread(buff, 72, 1, HZK);/*从偏移量的位置读取72个字节,每个汉字占72个字节*/ bool mat[24][24];//定义一个新的矩阵存放转置后的文字字膜 int i,j,k; for (i = 0; i<24; i++) /*24x24点阵汉字,一共有24行*/ { for (j = 0; j<3; j++) /*横向有3个字节,循环判断每个字节的*/ for (k = 0; k<8; k++) /*每个字节有8位,循环判断每位是否为1*/ if (buff[i * 3 + j] & (0x80 >> k)) /*测试当前位是否为1*/ { mat[j * 8 + k] = true; /*为1的存入新的字膜中*/ } else { mat[j * 8 + k] = false; } } for (i = 0; i < 24; i++) { p.x = x_offset; for (j = 0; j < 24; j++) { if (mat[j]) circle(image, p, 1, Scalar(255, 0, 0), -1); //写(替换)像素点 p.x++; //右移一个像素点 } p.y++; //下移一个像素点 } } //将汉字放在图片上 void put_text_to_image(int x_offset,int y_offset,String image_path,char* logo_path){ //x和y就是第一个字在图片上的起始坐标 //通过图片路径获取图片 Mat image=imread(image_path); int length=21;//要打印的字符长度(字节) unsigned char qh,wh;//定义区号,位号 unsigned long offset;//偏移量 unsigned char hexcode[30];//用于存放记事本读取的十六进制,记得要用无符号 FILE* file_logo; if ((file_logo = fopen(logo_path,"rb")) == NULL){ printf("Can't open txtfile,Please check the path!"); //getch(); exit(0); } fseek(file_logo, 0, SEEK_SET); fread(hexcode, length, 1, file_logo); int x =x_offset,y = y_offset;//x,y:在图片上绘制文字的起始坐标 for(int m=0;m break;//读到#号时结束 } else if(hexcode[m]>0xaf){ qh=hexcode[m]-0xaf;//使用的字库里是以汉字啊开头,而不是以汉字符号开头 wh=hexcode[m+1] - 0xa0;//计算位码 offset=(94*(qh-1)+(wh-1))*72L; paint_chinese(image,x,y,offset); /* 计算在汉字库中的偏移量 对于每个汉字,使用24*24的点阵来表示的 一行有三个字节,一共24行,所以需要72个字节来表示 */ m=m+2;//一个汉字的机内码占两个字节, x+=24;//一个汉字为24*24个像素点,由于是水平放置,所以是向右移动24个像素点 } else{//当读取的字符为ASCII码时 wh=hexcode[m]; offset=wh*16l;//计算英文字符的偏移量 paint_ascii(image,x,y,offset); m++;//英文字符在文件里表示只占一个字节,所以往后移一位就行了 x+=16; } } cv::imshow("image", image);//显示图片 cv::waitKey(); } 结果 |
|
|
|
只有小组成员才能发言,加入小组>>
3124 浏览 9 评论
2820 浏览 16 评论
3333 浏览 1 评论
8704 浏览 16 评论
3922 浏览 18 评论
9542浏览 3评论
876浏览 3评论
446浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
450浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2173浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-16 09:46 , Processed in 0.925385 second(s), Total 79, Slave 61 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191