vs2017+opevcv3.4.0(绘制点阵汉字)

需要的装备是vs2017版本的,OpenCV是3.4.0的,
首先进行相关的OpenCV配置。
打开vs2017,
如下图:
在属性的链接器->输入,添加语句:opencv_world340d.lib;
如果你的版本是opencv3.4.1,就应该添加:opencv_world340d.lib;
具体请按照你的OpenCV版本进行。
在这里插入图片描述
然后是VC++目录:
包含目录:
G:\ccbianchenview\opencv\opencv\build\include;
G:\ccbianchenview\opencv\opencv\build\include\opencv;
G:\ccbianchenview\opencv\opencv\build\include\opencv2;
库目录:
G:\ccbianchenview\opencv\opencv\build\x64\vc15\lib;
在这里插入图片描述

知道你新建的项目所在位置:
在这里插入图片描述
打开opencv11,添加一张.png图片,Asci0816.zf与HZKf2424.hz
logo.txt里面写上汉字:不在代码里面写死,灵活性比较好。
在这里插入图片描述

到了这一步,相关的准备工作都已经做完了,然后就是重点部分。
实验代码:

/******************************************************
文件名   :main.cpp
描  述   :24 点阵汉字显示在图片上
语  言   :c++
作  者   :无落
日  期   :2018-12-04
说  明   :需要24点阵汉字字库的支持
******************************************************/
// 取消vs对freopen等函数的警告
#include"pch.h"
#pragma warning(disable:4786)
#pragma warning(disable:4996)
#include <stdio.h>
#include <stdlib.h>
#include <cxcore.h>
#include <highgui.h>
#include <direct.h>
using namespace cv;

class ShowName {
public:
ShowName(char *filename);
ShowName(char *name, char* code);
~ShowName();
void openfile();//打开字库
void get_name_code();//获取汉字的区码和位码
void get_mat(unsigned char qh, unsigned char wh);//获取通过区码位码来确定mat
void draw_name(int num);
void getasi(char incode[]);//获取数字的ASCII码
void draw_code(int num);
void Runtodraw();
void file_Runtodraw();
protected:
FILE* CONTERNER;//内容提供者即文件logo.txt
FILE* HZK24;//24字库
FILE* ASI816;//ASCII字库
unsigned char mat[72];
unsigned char num_mat[16];
char name_code_box[30];
IplImage* img;//图片
const int MAPSIZE = 24;//字的size
const int INTERSIZE = 5;//插入间隔
unsigned char name_code[3][2];
private:
char *Name;
char *code;
char *Name_code;
int sum_word;//字体数目
int current_num;
};

ShowName::~ShowName() {
cvReleaseImage(&img);
fclose(HZK24);
fclose(ASI816);
if (CONTERNER != NULL)
fclose(CONTERNER);
img = NULL;
HZK24 = NULL;
ASI816 = NULL;
CONTERNER = NULL;
}

ShowName::ShowName(char *filename) {

if ((CONTERNER = fopen(filename, "rb")) == NULL)exit(1);
fseek(CONTERNER, 0, SEEK_SET);
fread(name_code_box, 30, 1, CONTERNER);
char *a = name_code_box;
Name_code = a;
sum_word = strlen(Name_code) - 2;
current_num = 0;
openfile();

}

ShowName::ShowName(char *name, char* code) {
this->Name = name;
this->code = code;
this->current_num = 0;
this->sum_word = strlen(Name) / 2 + strlen(this->code);
openfile();

}

void ShowName::openfile() {
char pbuf[100];
_getcwd(pbuf, 100);
//字库24*24的hz
strcat(pbuf, "/HZKf2424.hz");
char pbufASC[100];
_getcwd(pbufASC, 100);
//字库8*16的zf
strcat(pbufASC, "/Asci0816.zf");
// 读取图片
if ((img = cvLoadImage("test.png")) == NULL)exit(1);
// 打开字体文件
if ((HZK24 = fopen(pbuf, "rb")) == NULL)exit(1);
//打开asci8*16文件
if ((ASI816 = fopen(pbufASC, "rb")) == NULL)exit(1);
}

void ShowName::get_name_code() {
for (int i = 0; i < 3; ++i)
for (int j = 0; j < 2; ++j)
name_code[i][j] = Name[i * 2 + j] - 0xa0;
}

void ShowName::get_mat(unsigned char qh, unsigned char wh) {
long offset;
offset = (94 * (qh - 1) + (wh - 1)) * 72L;
// 读取数据存入数组
fseek(HZK24, offset, SEEK_SET);
fread(mat, 72, 1, HZK24);
}

void ShowName::draw_name(int num) {
// 图片的像素值
int width, height;
width = img->width;
height = img->height;
// 开始的x y像素点
int start_x, start_y, size, current_start_x, current_start_y;
size = MAPSIZE;// +INTERSIZE;
start_x = width - sum_word * size;
start_y = height - MAPSIZE - INTERSIZE;
// 开始绘制

CvScalar cs;

for (int i = 0; i < 24; ++i)
for (int j = 0; j < 3; ++j)
for (int k = 0; k < 8; k++)
if (((mat[i * 3 + j] >> (7 - k)) & 0x1) != NULL)
{
// 绘点
current_start_x = start_x + i + size * num;//24*24的是纵向排列的i对应的是x
current_start_y = start_y + j * 8 + k;
cs = cvGet2D(img, current_start_y, current_start_x);
cs.val[0] = 0;
cs.val[1] = 0;
cs.val[2] = 0;
cvSet2D(img, current_start_y, current_start_x, cs);
}
}

void ShowName::getasi(char incode[]) {
unsigned char qh, wh;
unsigned long offset;
offset = incode[0] * 16L;
fseek(ASI816, offset, SEEK_SET);
fread(num_mat, 16, 1, ASI816);
}

void ShowName::draw_code(int num) {
int width, height;
width = img->width;
height = img->height;
// 开始的x y像素点
int start_x, start_y, size, current_start_x, current_start_y;
size = MAPSIZE; //+INTERSIZE;
//int numsize = 8;
start_x = width - sum_word * size;
start_y = height - 16 - INTERSIZE;
// 开始绘制

CvScalar cs;
for (int i = 0; i < 16; ++i)
for (int k = 0; k < 8; k++)
if ((num_mat[i] & (0x80 >> k)) != NULL)
{
current_start_x = k + start_x + size * num;
current_start_y = start_y + i;
cs = cvGet2D(img, current_start_y, current_start_x);//获取图像相对位置的RGB的值
cs.val[0] = 0;//变黑
cs.val[1] = 0;//这里可以改成你喜欢的颜色
cs.val[2] = 0;
cvSet2D(img, current_start_y, current_start_x, cs);//重新设值
}

}


void ShowName::Runtodraw() {
unsigned char mask = 0x80;
char tmpcode[3] = { 0 };
while (*Name != NULL)
{
tmpcode[0] = *Name;
tmpcode[1] = *(Name + 1);
if (tmpcode[0] & mask) {
unsigned char qh, wh;
qh = tmpcode[0] - 0xaf;    //求区码
wh = tmpcode[1] - 0xa0;//求位码
get_mat(qh, wh);
draw_name(current_num++);
Name += 2;
}
}
while (*code != NULL)
{
tmpcode[0] = *code;
if (tmpcode[0])
{
getasi(code);
draw_code(current_num++);
code++;
}
}
cvShowImage("bt", img);
cvWaitKey();
}

void ShowName::file_Runtodraw() {
unsigned char mask = 0x80;
char tmpcode[3] = { 0 };
int x = 0;
while (*Name_code != NULL)
{
tmpcode[0] = *Name_code;
tmpcode[1] = *(Name_code + 1);
if (tmpcode[0] & mask) {
unsigned char qh, wh;
qh = tmpcode[0] - 0xaf;
wh = tmpcode[1] - 0xa0;
get_mat(qh, wh);
draw_name(current_num++);
Name_code += 2;
}
else if (tmpcode[0]) {
getasi(Name_code);
draw_code(current_num++);
Name_code++;
}
}
cvShowImage("bt", img);
cvWaitKey();
}
int main() {
char *filename = (char*)"logo.txt";  //从logo.txt中读取相关的文字
ShowName *newname = new ShowName(filename);
newname->file_Runtodraw();
delete newname;
return 0;
}

实现效果:
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值