在Ubuntu调用opencv库编程显示图片并叠加文字
一、汉字编码介绍
(一)区位码
(二)机内码
(三)点阵字库储存
(四)汉字点阵获取
二、操作步骤
(一)操作环境
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库编程显示图片并叠加文字相关推荐
- 两台电脑串口传输文件及调用opencv库编程显示图片和文本
文章目录 一.两台电脑利用串口进行文件传输 (一).实验内容 (二).配置环境 (三).实验过程 (四).结果分析 二.在Ubuntu下基于Linux环境调用opencv库编程显示图片和文本 (一). ...
- 在Ubuntu下用C/C++(或python)调用opencv库编程显示一张图片并在上面加文字
一.实验内容 调用opencv库编程显示一张图片,并打开一个名为"logo.txt"的文本文件(其中只有一行文本文件,包括你自己的名字和学号),按照名字和学号去读取汉字24*24点 ...
- 借助USB转RS232 模块串口传输练习、基于Ubuntu调用Opencv的点阵汉字字模读取
借助USB转RS232 模块串口传输练习.基于Ubuntu调用Opencv的点阵汉字字模读取 文章目录 借助USB转RS232 模块串口传输练习.基于Ubuntu调用Opencv的点阵汉字字模读取 1 ...
- 调用opencv库进行身份证号码识别主要流程
如题,就是对身份证拍照,处理相应照片,识别出身份证号码 这里需要调用opencv库.opencv库包含了许多处理图像的函数,功能全面而且强大,兼容多种语言.如何配置可以自行搜索. 主要流程如下: 读 ...
- 微信转发链接不显示图片和描述文字
微信转发链接不显示图片和描述文字,只显示标题. 如果你觉得排除了代码的错误. 那就可能是因为没有绑定正确的公众号$appid和$appsecret 不清楚,之前的微信链发代码,是不是需要这两样,现在是 ...
- java图片叠加_[原创]JAVA中图片上叠加文字的方法
--sunfruit JDK:1.3.x以上 功能:下面是一个简单在图片上面叠加文字的方法,有朋友如果有这方面的问题,就起个了解的作用 代码如下: import java.io.IOException ...
- 嵌入式Linux下LCD应用编程: 调用giflib库解码显示GIF动态图
一.开发环境介绍 开发板:友善之臂Tiny4412 LCD型号: S702 .分辨率: 800*480 Linux内核版本: Linux 3.5 交叉编译器: arm-linux-gcc 4.5.1 ...
- 【嵌入式05】Ubuntu下opencv新手操作:(打开图片及视频)
每一个程序背后都站着一堆优秀的代码库. 通过学习opencv图像库编程,了解如何借助第三方库函数完成一个综合程序设计. 一.关于opencv的安装 二.编写一个打开图片进行特效显示的代码 1.撰写代码 ...
- Ubuntu创建opencv工程并显示一张图片
https://blog.csdn.net/qq_30155503/article/details/79434863 注意事项: https://github.com/opencv/opencv_co ...
最新文章
- IOSUIcontrol事件
- 35个不会也要知道的Python小技巧
- 大二暑假周进度总结07
- 存储基础知识二 主要协议SCSI、FC、iSCSI
- Java虚拟机类加载机制——案例分析
- CAN总线数据帧/标准帧/扩展帧/远程帧/错误帧的组成格式对比
- 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(二)-- Web Api Demo
- CSS中的 ',' 、''、'+'、'~'
- 下拉列表项过多会导致浏览器卡死
- Navicat怎么看oracle作业,[数据库] Navicat for Oracle基本用法图文介绍
- 分析方法的基础 — 1. 拆分能力,分析师的第一技能
- 数据算法之希尔排序(shellSort)的Java实现
- FreeBSD--网络配置
- x61 linux 驱动 无线网卡,联想ThinkPad X61无线网卡驱动
- CTP的程序化交易系统开发
- Maya-Mixamo导出几何缓存错误
- java clob 读取_java 实现读取clob
- 服务器的1U、2U、4U是指什么?
- 一加9pro 鸿蒙系统,想换国产旗舰,一加9 Pro和华为Mate 40 Pro怎么选?
- 【ubuntu】Ubuntu系统下安装石墨文档