2014年11月28日 星期五
2014年11月27日 星期四
Opencv SURF 快速穩健的特徵 (Speeded-Up Robust Features)
參考 Author: Liu Liu liuliu. 1987+opencv@gmail.com
compareSURFDescriptors
naiveNearestNeighbor
findPairs
flannFindPairs
locatePlanarObject
維基 SURF:
http://en.wikipedia.org/wiki/SURF
Code的話 ~ 只要打 Author: Liu Liu liuliu. 搜尋就有了
1. 直接讀兩個圖檔去比對
2.想想還是把兩張圖檔的特徵值存成XML
利用: File Input and Output using XML and YAML files
網址:
http://docs.opencv.org/doc/tutorials/core/file_input_output_with_xml_yml/file_input_output_with_xml_yml.html
3.讀取XML的速度果然比較快 ~
不過NVIDIA有為OpenCV應用程式開發提供GPU加速
google : Computer Vision on the GPU with OpenCV
載入圖片存成XML ~ 在去搜尋比對圖片
雖然擷取特徵值存在XML裡面 ~在比對搜尋的話 ~如果有100多個圖片
用在視訊的話 ~ 恐怕可能超LAG的說
2014年11月26日 星期三
tesseract-ocr 文字訓練
在玩tesseract-ocr部分,當然要訓練圖形,讓tesseract-ocr原件去擷取特徵值
下載: jTessBoxEdit 工具
JTessBoxEdit是方便去框取字元 , 然後輸入字元跟制定座標軸
因為過於簡單 ~ 所以JTessBoxEdit部分 ~ 比較後會補充一下
首先主要講要怎麼製作訓練字元的語言包
因為每個版本都有差異如果要比較詳細的話就參考:
https://code.google.com/p/tesseract-ocr/wiki/TrainingTesseract3
詳細Tesseract 應用技術跟詳細流程文件(推薦):
https://code.google.com/p/tesseract-ocr/wiki/Documentation
1.
網址:http://vietocr.sourceforge.net/training.html
2.
3.
4.
5.
6.
7.
8.
9. cd C:\Program Files (x86)\Tesseract-OCR
10. 輸入 tesseract sel.timesitalic.exp0.tif sel.timesitalic.exp0 box.train
11.輸入 unicharset_extractor sel.timesitalic.exp0.box
12. font_properties 是自己去新增 ~
沒有什麼附檔名 ~ 就是直接命名 font_properties
輸入 timesitalic 1 0 0 1 0
之後DOS 輸入 shapeclustering -F font_properties -U unicharset sel.timesitalic.exp0.tr
13.輸入: mftraining -F font_properties -U unicharset -O unicharset sel.timesitalic.exp0.tr
14.輸入: cntraining sel.timesitalic.exp0.tr
15.
16.
17.輸入 : combine_tessdata sel.
18.
19. 輸入: tesseract.exe sel.timesitalic.exp0.tif ch001 -l sel
如果懶得用jTessBoxEditor 可以直接全部用DOS指令
1.
tesseract sel.timesitalic.exp0.tif sel.timesitalic.exp0 batch.nochop makebox
2.
tesseract sel.timesitalic.exp0.tif sel.timesitalic.exp0 box.train
3.
unicharset_extractor sel.timesitalic.exp0.box
4.
shapeclustering -F font_properties -U unicharset sel.timesitalic.exp0.tr
5.
mftraining -F font_properties -U unicharset -O unicharset sel.timesitalic.exp0.tr
6.
cntraining sel.timesitalic.exp0.tr
7.
combine_tessdata sel.
8.
tesseract.exe sel.timesitalic.exp0.tif ch001 -l sel
jTessBoxEdit 工具利用(附加篇)=>補上之前有一篇的符號辨識
1.
2.
3.
4.
5.
6.
7.
8.
之後照著之前的教學產生語言包去辨識符號
2014年11月25日 星期二
OpenCV + cvFindContours + tesseract-ocr
主指:
利用cvFindContour找出輪廓,然後依照輪廓的大小在去排除較小的輪廓
之後截取圖片利用 tesseract-ocr 辨識
缺點:
1.看來在符號部分必須還要在一次細部輪廓大小判別
2.在確認的部分,看來tesseract-ocr對英文跟數字的辨識率蠻高的說,
不過在符號的部分,卻沒有辨識,可能要在利用 tesseract-ocr的訓練器在截取 訓練符號的樣本了
流程:
1.樣本圖片:
2.在cvFindContours 尋找輪廓 ~在DOS部份我顯示出輪廓的高度
3.我把它存成tif檔案 ~但是肉眼一看明顯2.tif就是不及格的圖片
4.所以就加入限制
for (ptr =contours; ptr != NULL; ptr = ptr->h_next)
{
double reg = fabs(cvContourArea(ptr, CV_WHOLE_SEQ));
//if(reg >600 && reg <10000)
{
CvScalar ext_color = CV_RGB( 255, 255, 255 ); //randomly coloring different contours
CvRect rectEst = cvBoundingRect( ptr, 0 );
CvPoint pt1,pt2;
pt1.x = rectEst.x;
pt1.y = rectEst.y;
pt2.x = rectEst.x+ rectEst.width;
pt2.y = rectEst.y+ rectEst.height;
printf("%d \n",(pt2.y-pt1.y));
int thickness =1 ;
cvRectangle( img3, pt1, pt2, CV_RGB(255,255,255 ), thickness );
cvSetImageROI(img,rectEst);
if((pt2.y-pt1.y)>30)
{
object_total++;
char filename[50]; // buff is large enough to hold the entire formatted string
sprintf(filename, "%d.tif", object_total);
// printf(filename);
cvSaveImage(filename,img,0);
}
cvResetImageROI(img);
}
}
5.結合另一篇 (tesseract-ocr 文字辨識 ) 去辨識三張圖片~輸出文字
tesseract::TessBaseAPI api;
api.Init("", "eng", tesseract::OEM_DEFAULT);
api.SetPageSegMode(static_cast<tesseract::PageSegMode>(7));
api.SetOutputName("out");
for(int i=1;i<=object_total;i++){
char image[256];
sprintf(image, "%d.tif", i);
PIX *pixs = pixRead(image);
STRING text_out;
api.ProcessPages(image, NULL, 0, &text_out);
FILE *output;
char itxt[256];
sprintf(itxt, "%d.txt", i);
output=fopen(itxt,"wb");
fwrite( text_out.string(), 1, text_out.length(), output );
fclose(output);
string Text01 = UTF8ToBig5(text_out.string());
cout<<"輸出文字:"<<Text01.c_str()<<endl;
}
擷取樣本圖示:
1.tif
2.tif
3.tif
2014年11月20日 星期四
tesseract-ocr 文字辨識
首先先感謝Google ~ 開放了這麼有趣又簡單操作工具
用Google用繁體搜尋 , 感覺台灣玩的有點不熱絡 , 讓我感覺有點失望的說
不過 tesseract-ocr 資料跟其他應用,還是不少的說
環境:
OS: Win 7 64
VC++ 2008
1.先到此網站下載 tesseract-ocr-setup-3.02.02.exe 安裝
https://code.google.com/p/tesseract-ocr/downloads/list
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16. 測試看看 tesseract-ocr 原本的自己exe檔案
17. 查看版本
18. 測試看看英文包
19.測試看看中文包
20.用中文包來測試看看 ~ 英文跟中文夾雜的圖片 ~沒想到還可以測試成功
21.
API參考資料:
http://zdenop.github.io/tesseract-doc/index.html
簡單的程式碼:
#include <baseapi.h>
#include <allheaders.h>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
string UTF8ToBig5(const std::string& strUTF8);
int main(void){
tesseract::TessBaseAPI api;
api.Init("", "chi_tra", tesseract::OEM_DEFAULT);
api.SetPageSegMode(static_cast<tesseract::PageSegMode>(7));
api.SetOutputName("out");
char image[256]="4.tif";
PIX *pixs = pixRead(image);
STRING text_out;
api.ProcessPages(image, NULL, 0, &text_out);
FILE *output;
output=fopen("test.txt","wb");
fwrite( text_out.string(), 1, text_out.length(), output );
fclose(output);
string Text01 = UTF8ToBig5(text_out.string());
cout<<"輸出文字:"<<Text01.c_str()<<endl;
system("pause");
}
string UTF8ToBig5(const std::string& strUTF8)
{
int len = MultiByteToWideChar(CP_UTF8, 0, strUTF8.c_str(), -1, NULL, 0);
unsigned short * wszBig5 = new unsigned short[len + 1];
memset(wszBig5, 0, len * 2 + 2);
MultiByteToWideChar(CP_UTF8, 0,LPCSTR(strUTF8.c_str()), -1, LPWSTR(wszBig5), len);
len = WideCharToMultiByte(CP_ACP, 0,LPCWSTR(wszBig5), -1, NULL, 0, NULL, NULL);
char *szBig5 = new char[len + 1];
memset(szBig5, 0, len + 1);
WideCharToMultiByte(CP_ACP,0, LPCWSTR(wszBig5), -1, szBig5, len, NULL, NULL);
std::string strTemp(szBig5);
delete[]szBig5;
delete[]wszBig5;
return strTemp;
}
訂閱:
文章 (Atom)