QT“图片转文字”
如果你想找的是“文字識別”,可以看看QT使用PaddleOCR文字識別是不是你想要的
環境
Windows7
Qt Creator 4.5.1 (MSVC2017_64)
Qt 5.10.1
效果圖
源碼下載
可以從github imgtotext下載代碼
部分代碼及原理
距離第一次看到這種“圖片”怕是有年頭了,最近突然想自己實現一個試試,應該說這個程序的原理和代碼都不復雜,不過想要較高的運行速度或者處理視頻的話可能要借助其他圖形處理庫并花點心思優化。
用各種語言和工具寫了類似程序的人估計都不少了,畢竟網絡上時有遇見,而且感覺有經驗的人實現這個也就是隨手的事,然而其他想知道是如何實現的人就不是很容易找到答案了,換了好幾種我認為可以描述這個效果的短語,發現都有描述相近但更受關注的問題,比如搜“圖片轉文字”的結果基本都是“文字識別”相關的……
一句話概括原理的話,就是用文字來代替圖片中的像素點,文字筆畫比較稀疏的文字用來表示較淺的顏色,較密的則用來表示深色即可。
剩下的要解決的問題就是找到一種工具可以操作圖片的像素并考慮如何進行具體的操作了。
QT的QImage類即可完成上述的任務。
std::vector<QString> textPixel;textPixel.push_back(QString::fromLocal8Bit("一"));//8個漢字代表8種顏色textPixel.push_back(QString::fromLocal8Bit("乙"));//從上到下由淺入深textPixel.push_back(QString::fromLocal8Bit("大"));//使用更多的漢字未必能獲得更好的效果textPixel.push_back(QString::fromLocal8Bit("丙"));//一是因為這種圖能表示的像素數量本身就很有限textPixel.push_back(QString::fromLocal8Bit("交"));//二是漢字的疏密程度也不是很好分級,就難以對應更多的顏色textPixel.push_back(QString::fromLocal8Bit("羽"));textPixel.push_back(QString::fromLocal8Bit("拜"));textPixel.push_back(QString::fromLocal8Bit("慧"));//fromLocal8Bit是為了正確的顯示漢字QString imgPath=QFileDialog::getOpenFileName(this,"Choose Image","","Image File(*.png *.jpg *.bmp)");if(imgPath.size()==0){return;}ui->textBrowser->clear();QImage q(imgPath);m_label->resize(ui->widget->size());m_label->setPixmap(QPixmap::fromImage(q.scaled(m_label->size(),Qt::KeepAspectRatio)));m_label->show();q=q.convertToFormat(QImage::Format_Grayscale8);//將圖片轉換為黑白的q=q.scaledToWidth(pix);//調整圖片大小,使水平方向的像素點為pix個q.invertPixels();//反置圖片顏色,這步可以省略//如果省略,越亮的像素點顏色數值越大,后面替換成文字的時候就得繞個彎for(int i=0;i<q.height();++i){for(int j=0;j<q.width();++j){//逐一掃描圖片中的像素點,黑白圖片的顏色由0-255的整形數字表示//我們一共使用了8個漢字,那么就將顏色值除以32將其分成八組即可,這里可以使用哈希表優化ui->textBrowser->insertPlainText(textPixel[qRed(q.pixel(j,i))/32]);}ui->textBrowser->insertPlainText("\n");}代碼中有漢字經常帶來問題……如果你編譯時出現“常量中含有換行符”的錯誤,可以如下圖設置,或者使用英文等字符替換像素。
這個程序沒做什么優化,雖然我設置的像素區間比較大(5-1080),但當你每行使用較多像素點時(大概是200以上?畢竟O(N2)…),會非常耗時,程序會卡住很長時間,慎用。
總結
- 上一篇: dpdk 18 ixgbe驱动初始化分析
- 下一篇: centos上使用高版本gcc、g++