一、汉字编码介绍

(一)区位码

(二)机内码

(三)点阵字库储存

(四)汉字点阵获取

二、操作步骤

(一)操作环境

OpenCV

(二)实验准备

(1)下载中文点阵字库及显示工具程序
(2)将所需文件及图片放入目录

(三)代码

(1)运行虚拟机并打开命令窗
(2)添加代码

#include<iostream>
#include<opencv/cv.h>
#include"opencv2/opencv.hpp"
#include<opencv/cxcore.h>
#include<opencv/highgui.h>
#include<math.h>
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/lc/1/1.jpg";char* logo_path=(char*)"/home/lc/1/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/lc/1/Asci0816.zf", "rb")) == NULL){printf("Can't open ascii.zf,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[i] & (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/lc/1/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][i] = true;          /*为1的存入新的字膜中*/}else {mat[j * 8 + k][i] = false;}}for (i = 0; i < 24; i++){p.x = x_offset;for (j = 0; j < 24; j++){       if (mat[i][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=22;//要打印的字符长度(字节)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<length;){if(hexcode[m]==0x23){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();
}

编译

g++ test.c -o test `pkg-config --cflags --libs opencv`

(四)运行

输入代码运行

./test

得到图片

三、总结

这次实验熟悉了opencv的环境,实现了在图片上叠加文字。

四、参考

https://blog.csdn.net/m0_58414679/article/details/121313982?spm=1001.2014.3001.5501

在Ubuntu调用opencv库编程显示图片并叠加文字相关推荐

  1. 两台电脑串口传输文件及调用opencv库编程显示图片和文本

    文章目录 一.两台电脑利用串口进行文件传输 (一).实验内容 (二).配置环境 (三).实验过程 (四).结果分析 二.在Ubuntu下基于Linux环境调用opencv库编程显示图片和文本 (一). ...

  2. 在Ubuntu下用C/C++(或python)调用opencv库编程显示一张图片并在上面加文字

    一.实验内容 调用opencv库编程显示一张图片,并打开一个名为"logo.txt"的文本文件(其中只有一行文本文件,包括你自己的名字和学号),按照名字和学号去读取汉字24*24点 ...

  3. 借助USB转RS232 模块串口传输练习、基于Ubuntu调用Opencv的点阵汉字字模读取

    借助USB转RS232 模块串口传输练习.基于Ubuntu调用Opencv的点阵汉字字模读取 文章目录 借助USB转RS232 模块串口传输练习.基于Ubuntu调用Opencv的点阵汉字字模读取 1 ...

  4. 调用opencv库进行身份证号码识别主要流程

    如题,就是对身份证拍照,处理相应照片,识别出身份证号码 这里需要调用opencv库.opencv库包含了许多处理图像的函数,功能全面而且强大,兼容多种语言.如何配置可以自行搜索.  主要流程如下: 读 ...

  5. 微信转发链接不显示图片和描述文字

    微信转发链接不显示图片和描述文字,只显示标题. 如果你觉得排除了代码的错误. 那就可能是因为没有绑定正确的公众号$appid和$appsecret 不清楚,之前的微信链发代码,是不是需要这两样,现在是 ...

  6. java图片叠加_[原创]JAVA中图片上叠加文字的方法

    --sunfruit JDK:1.3.x以上 功能:下面是一个简单在图片上面叠加文字的方法,有朋友如果有这方面的问题,就起个了解的作用 代码如下: import java.io.IOException ...

  7. 嵌入式Linux下LCD应用编程: 调用giflib库解码显示GIF动态图

    一.开发环境介绍 开发板:友善之臂Tiny4412 LCD型号: S702 .分辨率: 800*480 Linux内核版本: Linux 3.5 交叉编译器: arm-linux-gcc 4.5.1 ...

  8. 【嵌入式05】Ubuntu下opencv新手操作:(打开图片及视频)

    每一个程序背后都站着一堆优秀的代码库. 通过学习opencv图像库编程,了解如何借助第三方库函数完成一个综合程序设计. 一.关于opencv的安装 二.编写一个打开图片进行特效显示的代码 1.撰写代码 ...

  9. Ubuntu创建opencv工程并显示一张图片

    https://blog.csdn.net/qq_30155503/article/details/79434863 注意事项: https://github.com/opencv/opencv_co ...

最新文章

  1. IOSUIcontrol事件
  2. 35个不会也要知道的Python小技巧
  3. 大二暑假周进度总结07
  4. 存储基础知识二 主要协议SCSI、FC、iSCSI
  5. Java虚拟机类加载机制——案例分析
  6. CAN总线数据帧/标准帧/扩展帧/远程帧/错误帧的组成格式对比
  7. 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(二)-- Web Api Demo
  8. CSS中的 ',' 、''、'+'、'~'
  9. 下拉列表项过多会导致浏览器卡死
  10. Navicat怎么看oracle作业,[数据库] Navicat for Oracle基本用法图文介绍
  11. 分析方法的基础 — 1. 拆分能力,分析师的第一技能
  12. 数据算法之希尔排序(shellSort)的Java实现
  13. FreeBSD--网络配置
  14. x61 linux 驱动 无线网卡,联想ThinkPad X61无线网卡驱动
  15. CTP的程序化交易系统开发
  16. Maya-Mixamo导出几何缓存错误
  17. java clob 读取_java 实现读取clob
  18. 服务器的1U、2U、4U是指什么?
  19. 一加9pro 鸿蒙系统,想换国产旗舰,一加9 Pro和华为Mate 40 Pro怎么选?
  20. 【ubuntu】Ubuntu系统下安装石墨文档

热门文章

  1. 从左手坐标系到右手坐标系的变换
  2. 小朋友们,你试过用Python绘制小猪佩奇吗?来开始创作吧
  3. 从零开始部署一套脱单盲盒
  4. 100个python案例
  5. 若秋叶静离枝淡对离别
  6. jquery实现表情图添加与发布功能
  7. Visual Studio 2013键盘码农常用快捷键
  8. 2023计算机考研择校分析【23考研必读】
  9. easyexcle 设置列宽_easyexcel自动列宽失效
  10. 捡到iphone6怎么解锁_捡了一部苹果6,怎么解开指纹锁,