⑴ vb 部分截屏之後識別圖片上的文字
主要是先要將圖片轉換為位元組數組
'存放格式為(*, *, *),從左下角開始:
'第一維:0-藍色分量,1-綠色分量,2-紅色分量,
'第二維:列;第三維:行
全部步驟如下
1、用DibGet獲取圖片數據
2、用ColorToBlackAndWhite(或ColorToGray+OtsuColorToBlackAndWhite)將圖片數據轉換為黑白數據
3、用DibPut將數據恢復到一個PictureBox中
4、截取各個數字到單獨的PictureBox中
5、將數字圖片轉換為圖片數據,並與標准數據(0-9)對比,相似度最高的為准(比如與1的相似度為75%,與2的相似度為85%,則此數字為2)
有問題Hi
'圖像輸出的過程:
Public Sub DIBPut(ByVal IdDestination As Long, ByRef ImageData() As Byte)
Dim LineBytes As Long
Dim Width As Long, Height As Long
Width = UBound(ImageData, 2) + 1
Height = UBound(ImageData, 3) + 1
On Error GoTo ErrLine
Done = False
With bi24BitInfo.bmiHeader
.biWidth = Width
.biHeight = Height
LineBytes = ((Width * Bits + 31) And &HFFFFFFE0) \ 8
.biSizeImage = LineBytes * Height
End With
SetDIBitsToDevice IdDestination, 0, 0, Width, Height, 0, 0, 0, Height, ImageData(0, 0, 0), bi24BitInfo, 0
Done = True
Exit Sub
ErrLine:
MsgBox Err.Description
End Sub
'灰度處理SrcData(0 to 2, 0 to 寬度-1, 0 to 高度-1)
Public Sub ColorToGray(ByRef SrcData() As Byte, ByRef DestData() As Byte, _
Optional Left As Long = -1, Optional Top As Long = -1, _
Optional Right As Long = -1, Optional Bottom As Long = -1)
Dim i As Long, j As Long, k As Long
Dim red As Byte, green As Byte, blue As Byte
Dim Color As Long, newcolor As Long
Dim Width As Long, Height As Long
Width = UBound(SrcData, 2) + 1
Height = UBound(SrcData, 3) + 1
If Left = -1 Then Left = 0
If Top = -1 Then Top = 0
If Right = -1 Then Right = Width - 1
If Bottom = -1 Then Bottom = Height - 1
For j = Left To Right
For k = Height - Bottom - 1 To Height - Top - 1
blue = SrcData(0, j, k)
green = SrcData(1, j, k)
red = SrcData(2, j, k)
newcolor = CLng(0.299 * CDbl(red) + 0.585 * CDbl(green) + 0.114 * CDbl(blue)) '
newcolor = newcolor * 65793
red = newcolor Mod 256
green = newcolor / 256 Mod 256 '(9798 * RValue + 19235 * GValue + 3735 * BValue) / 32768
blue = newcolor / 256 / 256
DestData(0, j, k) = blue
DestData(1, j, k) = green
DestData(2, j, k) = red
Next
Next
End Sub
'黑白處理DestData(0 to 2, 0 to 寬度-1, 0 to 高度-1)
'圖片最下面兩行總是無法參與變換????只好將採集的圖片區域向下多延伸2個像素
Public Sub ColorToBlackAndWhite(ByRef SrcData() As Byte, ByRef DestData() As Byte)
Dim i As Long, j As Long, k As Long
Dim red As Byte, green As Byte, blue As Byte
Dim Color As Long, newcolor As Long
Dim Width As Long, Height As Long
Width = UBound(SrcData, 2) + 1
Height = UBound(SrcData, 3) + 1
For j = 0 To Width - 1
For k = 0 To Height - 1
blue = SrcData(0, j, k)
green = SrcData(1, j, k)
red = SrcData(2, j, k)
newcolor = CLng(0.3 * CDbl(red) + 0.59 * CDbl(green) + 0.11 * CDbl(blue))
' newcolor = CLng(0.39 * CDbl(red) + 0.5 * CDbl(green) + 0.11 * CDbl(blue))
If newcolor > 127 Then newcolor = 255 Else newcolor = 0
red = newcolor
green = newcolor
blue = newcolor
DestData(0, j, k) = blue
DestData(1, j, k) = green
DestData(2, j, k) = red
Next
Next
End Sub
'黑白處理DestData(0 to 2, 0 to 寬度-1, 0 to 高度-1)
'圖片最下面兩行總是無法參與變換????只好將採集的圖片區域向下多延伸2個像素
'OSTU演算法可以說是自適應計算單閾值(用來轉換灰度圖像為二值圖像)的簡單高效方法。
'1978 OTSU年提出的最大類間方差法以其計算簡單、穩定有效,一直廣為使用。
Public Sub OtsuColorToBlackAndWhite(ByRef SrcData() As Byte, ByRef DestData() As Byte)
On Error Resume Next
Dim i As Long, j As Long, k As Long
Dim red As Byte, green As Byte, blue As Byte
Dim Color As Long, newcolor As Long
Dim Width As Long, Height As Long
Dim AllSum As Long, SumSmall As Long, SumBig As Long, PartSum As Long
Dim AllPixelNumber As Integer, PixelNumberSmall As Long, PixelNumberBig As Long
Dim ProbabilitySmall As Double, ProbabilityBig As Double, Probability As Double, MaxValue As Double
Dim BmpData() As Byte, Threshold As Byte
Dim Histgram(255) As Integer '圖像直方圖,256個點
Dim PixelNumber As Integer
Width = UBound(SrcData, 2) + 1
Height = UBound(SrcData, 3) + 1
PixelNumber = Width * Height
For i = 0 To Width - 1
For j = 0 To Height - 1
Histgram(SrcData(0, i, j)) = Histgram(SrcData(0, i, j)) + 1 '統計圖像的直方圖
Next
Next
For i = 0 To 255
AllSum = AllSum + i * Histgram(i) ' 質量矩
AllPixelNumber = AllPixelNumber + Histgram(i) ' 質量
Next
MaxValue = -1#
For i = 0 To 255
PixelNumberSmall = PixelNumberSmall + Histgram(i)
PixelNumberBig = AllPixelNumber - PixelNumberSmall
If PixelNumberBig = 0 Then Exit For
SumSmall = SumSmall + i * Histgram(i)
SumBig = AllSum - SumSmall
ProbabilitySmall = CDbl(SumSmall) / PixelNumberSmall
ProbabilityBig = CDbl(SumBig) / PixelNumberBig
' Probability = PixelNumberSmall * PixelNumberBig * (ProbabilityBig - ProbabilitySmall) * (ProbabilityBig - ProbabilitySmall)
Probability = PixelNumberSmall * ProbabilitySmall * ProbabilitySmall + PixelNumberBig * ProbabilityBig * ProbabilityBig
If Probability > MaxValue Then
MaxValue = Probability
Threshold = i
End If
Next
For j = 0 To Width - 1
For k = 0 To Height - 1
If SrcData(0, j, k) <= Threshold Then
DestData(0, j, k) = 0
DestData(1, j, k) = 0
DestData(2, j, k) = 0
Else
DestData(0, j, k) = 255
DestData(1, j, k) = 255
DestData(2, j, k) = 255
End If
Next
Next
End Sub
'迭代法 (最佳閥值法)
'(1)求出圖象的最大灰度值和最小灰度值,分別記為Zl和Zk,令初始閾值為:T=(Zl+Zk)/2
'(2)根據閾值TK將圖象分割為前景和背景,分別求出兩者的平均灰度值Z0和ZB:
'(3)令當前閾值Tk=(Z0+ZB)/2
'(4)若TK=TK+1, 則所得即為閾值,否則轉2,迭代計算。
Public Sub (ByRef SrcData() As Byte, ByRef DestData() As Byte)
Dim i As Long, j As Long, k As Long
Dim red As Byte, green As Byte, blue As Byte
Dim Color As Long, newcolor As Long
Dim Width As Long, Height As Long
Dim PixelNumber As Integer
Dim Threshold As Integer, NewThreshold As Integer, MaxGrayValue As Integer
Dim MinGrayValue As Integer, MeanGrayValue1 As Integer, MeanGrayValue2 As Integer
Dim IP1 As Long, IP2 As Long, IS1 As Long, IS2 As Long
Dim Iteration As Long, Histgram(255) As Integer
Width = UBound(SrcData, 2) + 1
Height = UBound(SrcData, 3) + 1
PixelNumber = Width * Height
'求出圖像中的最小和最大灰度值,並 計算閾值初值為
MaxGrayValue = 0: MinGrayValue = 255
For i = 0 To Width - 1
For j = 0 To Height - 1
Histgram(SrcData(0, i, j)) = Histgram(SrcData(0, i, j)) + 1 '統計圖像的直方圖
If MinGrayValue > SrcData(0, i, j) Then MinGrayValue = SrcData(0, i, j)
If MaxGrayValue < SrcData(0, i, j) Then MaxGrayValue = SrcData(0, i, j)
Next
Next
NewThreshold = (MinGrayValue + MaxGrayValue) / 2
While Threshold <> NewThreshold And Iteration < 100
Threshold = NewThreshold
'根據閾值將圖像分割成目標和背景兩部分,求出兩部分的平均灰度值
For i = MinGrayValue To Threshold
IP1 = IP1 + Histgram(i) * i
IS1 = IS1 + Histgram(i)
Next
MeanGrayValue1 = CByte(IP1 / IS1)
For i = Threshold + 1 To MaxGrayValue
IP2 = IP2 + Histgram(i) * i
IS2 = IS2 + Histgram(i)
Next
MeanGrayValue2 = CByte(IP2 / IS2)
'求出新的閾值:
NewThreshold = (MinGrayValue + MaxGrayValue) / 2
Iteration = Iteration + 1
Wend
For j = 0 To Width - 1
For k = 0 To Height - 1
If SrcData(0, j, k) <= Threshold Then
DestData(0, j, k) = 0
DestData(1, j, k) = 0
DestData(2, j, k) = 0
Else
DestData(0, j, k) = 255
DestData(1, j, k) = 255
DestData(2, j, k) = 255
End If
Next
Next
End Sub
⑵ 怎樣用vb識別圖片中的阿拉伯數字
1、可以用腳本,你提供的圖片位置上的數字問題。如果這個數字是類似驗證碼那一類的異性字元,那這腳本的難度就有點大。如果只是單純的普通文字,那這腳本並不復雜。如果是桌面解析度1024,768就如下,自己可以根據解析度改。
2、:做字型檔1-9;2:固定X坐標上限和下限找字,找到了就點擊,並保存Y坐標+偏移;3:循環步驟2,把步驟2中的Y上限修改為保存Y坐標+偏移。
3、先用大漠插件二值化處理文字,獲得點陣做成字型檔。然後就能識字了。然後把識別的字轉化為數值,存到變數A,B然後判斷。如果A=B則。。
4、按鍵精靈里用大漠插件識別數字非常好用,將數字載入數組,調用即可。比如找到4後,將4放入第一個數組。再識別第二個數,比如2再用一個自定義函數來調用兩個數組,使他們相加。最後調用這個自定義函數就是最終要的目的了。
⑶ vb中的換行符號是什麼
指的是一種加在文字最後位置的特殊字元,在換行字元的下一個字元將會出現在下一行。
換行字元可以看作是行的結束符,也可以看作行之間的分隔符,這兩種處理方式之間存在一些歧義。如果換行字元被當作分隔符,那麼文件的最後一行就不需要再有換行字元。但是多數系統的做法是在最後一行的後面也加上一個換行字元,也就是把換行字元看作是行的結束符。
這樣的程序在處理末行沒有換行字元的文件時,可能會存在問題。相反地,有的程序把換行符看作分隔符,就會把最末尾的換行字元看作是新行的開始,也就是多出了一個空行。
(3)vb圖片文字識別擴展閱讀
換行符的類別
C語言
" "
C語言中的換行符是" ",就是輸入完一行內容後,游標轉到下一行的起始位置 。
例如:
printf("first line ");
printf("second line ");
C++語言
"endl"
C++語言中的換行符是endl。
例如:
cout<<"這是換"<<endl<<"行符";
將顯示輸出:
這是換
行符
word換行符
word換行符是一種換行符號,它的作用是換行顯示,但是它不是真正的段落標記,它的換行不是真正意義上的重起一段,因此被換行符分割的文字其實仍然還是一個段落中的,word中基於段落的所有操作都是不會識別換行符為段落結尾的。
VB語言
在VB中,若命令太長,在一行輸入不方便,可以在代碼後輸入空格和下劃線再換行。
例如:
Private Declare Function mciSendString Lib winmm. _
dll Alias mciSendStringA (ByVal lpstrCommand As String, _
ByVal lpstrReturnString As String, ByVal uReturnLength _
As Long, ByVal hwndCallback As Long) As Long。
⑷ vb編程識別圖片中文字
識別圖片里文字的方法,通常稱為OCR(Optical Character Recognition,光學字元識別),需要利用非常復雜的模式識別演算法才能實現。自己用VB開發OCR程序工作量太大。
可以考慮採用OCR插件,即在電腦上安裝OCR控制項,然後在VB程序中調用該控制項。如WPS,紫光、漢王的OCR系統都帶有可調用的控制項,但都比較大,而且有使用限制。我曾經用過一個免費的91OCR控制項,識別效果還馬馬虎虎可以。