文章目錄
- 一、opencv的簡單使用
- 1、檔案準備
- 2、相關代碼
- 二、串口傳輸檔案,
- 總結
一、opencv的簡單使用
1、檔案準備
建立一個檔案夾,將此次需要用到的檔案裝在同一檔案夾下,
本次需要用到的檔案如下,圖片自行選取,logo.txt檔案為將要與圖片重疊的字,其它為字庫檔案,
字庫檔案提取鏈接:
https://pan.baidu.com/s/1wAWeAX9R0hzqSuBx_dxJjw
提取碼:4455

2、相關代碼
1、打開Ubuntu終端,進行檔案夾并編輯代碼,
cd optp/build
vim wz.cpp
代碼如下:
#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="star.jpeg";
char* logo_path=(char*)"logo.txt";
put_text_to_image(70,620,image_path,logo_path);//安排文字從圖片像素坐標(70,
620)開始顯示
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("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("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=19;//要列印的字符長度(位元組)
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();
}
注意!!!:
- 檔案路徑要改為自己的,如果在同檔案夾下,直接寫檔案名就行,
- Ubuntu下檔案的字體默認是UTF-8,可能會讓字體識別錯誤,建議改為GB18030 ,
- 至于字體顯示的位置與顯示的長度,需要自己調節,代碼中有注釋,
2、編譯
指令如下:
g++ wz.cpp -o wz `pkg-config --cflags --libs opencv`
注意!!!:一定要加" ` "且注意空格,
輸入
./wz
查看運行結果,
3、運行結果

二、串口傳輸檔案,
1.連接串口,
只需將TXD與RXD反接插入電腦即可,我這兒就插入了自己的電腦進行傳輸

2、進行傳輸
打開串口除錯軟體,我使用的是SSCOM,
首先設定波特率,也就是傳輸速率,
再選擇要傳輸的埠號,進行傳輸,
再打開檔案,選擇自己想傳輸的檔案,
最后打開串口,選擇發送檔案進行傳輸,

3、理論時間與實際時間的比較,
預計時間:50.1s
理論時間=560409*8/115200+560409/256/1000=41.1s
實際時間:68s

實際時間要遠遠大于理論時間和預估時間,
總結
感覺上這次是進行的最愉快的一次,沒有太多的問題,opencv是個很強大的軟體,這次只是一次簡單的應用,但也識訓很多,那代碼要我自己寫至少現在是寫不出來的,所以感謝網路上各位大神的開源代碼,
參考鏈接:
https://blog.csdn.net/m0_58414679/article/details/121315155
https://blog.csdn.net/m0_58414679/article/details/121313982
https://blog.csdn.net/weixin_46129506/article/details/121178340
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/357260.html
標籤:其他
