テキストブロックの分割の仕方によって投影された最後の(参照https://www.cnblogs.com/BoyTNT/p/11812323.htmlを)が、この方法には多くの制限があり、要件のブランチ明確な文字はそうではありませんスパン複数の行は、傾け、だけでなく、ノイズに敏感ではありません。または背面の写真を撮るが、私は大きな単語の上に追加、結果は問題を抱えています:
それが原因間違った枝の上に水平投影が得られ、複数行にわたる大きな「テスト」という言葉を、の右下隅に見ることができます。
ベースの接続分析を行うための別の方法、。簡単に言えば、それは、一緒に同じ文字の異なる部分、及び隣接文字が全体に重なるように、解析の各個々のブロックを見つけるためにその結果、特定の画像伸張動作を行うために、ノイズを除く残り基本的な結果は、条件に沿ったものです。
直接コード、およびその後の分析で:
使用してシステムを。 使用してSystem.Collections.Genericを。 使用してSystem.IOを。 使用してSystem.Textのを。 使用してOpenCvSharpを。 使用してOpenCvSharp.Extensionsを。 使用してOpenCvSharp.Utilitiesを。 名前空間OpenCvTest { クラスプログラム { 静的な 無効メイン(文字列[] argsを) { // 读入源文件 VAR SRC = IplImage.FromFile(" source.jpg " ); // 转换到灰度图 VAR灰色= Cv.CreateImage(src.Size、BitDepth.U8、1); Cv.CvtColor(SRC、グレー、ColorConversion.BgrToGray); // いくつかの拡張、xおよびy方向に行うか、異なる係数を有する // 使用が同等になるように、白領域に対する操作をエッチングする、方法を浸食しますテキストが拡大された VAR(カーネルCv.CreateStructuringElementEx = 5、2、1、1 、ElementShape.Rect); Cv.Erode(グレー、グレー、カーネル、2 ); // 値化 Cv.Threshold(グレー、グレー、0、255、ThresholdType.BinaryInv | ThresholdType.Otsu); // 検出通信ドメイン、通信ドメインポイントの各シリーズを表現するために、FindContours方法は、最初のドメイン取得でき VARストレージ= Cv.CreateMemStorage()。 CvSeq <CvPoint>輪郭= ヌル; Cv.FindContours(グレー、ストレージ、OUT 輪郭、CvContour.SizeOf、ContourRetrieval.CComp、ContourChain.ApproxSimple); VAR色= 新新 CvScalar(0、0、255 ); // 横断 中(!輪郭= NULL ) { // 通信エリアを取得外接矩形 VAR RECT = Cv.BoundingRect(輪郭); // 高さが不十分である、またはアスペクト比が小さすぎると、それは無効なデータである場合、または元の長方形のビデオへ上の図 IF(rect.height> 10 &&(* rect.width 1.0/ Rect.height)> 0.2 ) Cv.DrawRect(SRC、RECT、カラー); // 通信ドメイン削除 等高線= contour.HNextを; } Cv.ReleaseMemStorage(ストレージ); // 表示 Cv.ShowImage(" 結果" 、SRC); Cv.WaitKey(); Cv.DestroyAllWindows(); } } }
以下のステップ解析によるステップ。読み取った原稿はこれです:
拡張階調処理に変換され、それは複数の文字が、実質的に同一のテキストブロックが一緒に付着されていることがわかる有します。
二値化画像の後に:
接続性の分析を行った後、元の分析された結果がこれです:
Cv.DrawContours(SRC、輪郭、色、色、1)。
各連結成分のための外接矩形をとり、最終的な結果は、このです。
私たちは、別のテキストブロックが検出されると、より大きな単語を使用することができ、より良い以前よりも多くの効果を見ることができます。さらに、テキストブロックが同じ行であっても、もはや絶対列に整列し、わずかに変動しないであろう。
許可なしに禁止されています。