这才是我当年写出的一个比较烂的程序
(a i&v 4HK#]M>yz Main2.bas
L
Y^pmak mMvt#+O Attribute VB_Name = "SubMain"
#Hr>KQ5mJQ Option Explicit
~O}LAzGb 4`7:gfrO, '采集文件与临时文件
H?>R#Ds- Public Const TmpFile As String = "d:\30-0600.dat"
9q-9UC!g '已有数据:30-0600.dat /30日早6点进车与6:30出车头
v9OK
< q G%'Lt Public fStatus As Long, hFile As Long, bytesRW As Long, lptrFile As Long
.qCD(XZ+ Public hBCFile As Long '记录采集参数的文件
5l"v:Px Public Const TmpBMP As String = "d:\1.bmp"
q~=]_PMP Public hTmpFile As Long
AA
um1xl #}W^d^-5t5 rBZ0(XSZQ '采集窗口参数常量
*1KrI9i Public Const FrameH As Long = 280&
RscU=oaKi Public Const FrameW As Long = 768&
y
ZsC> Public Const pFrameSize As Long = FrameW * FrameH
bgjo_!J+Pp Q_F8u!qrZ '标志区范围,用于识别车辆
eZm,K'/! Public Const PilarC As Integer = 260 '识别标志立柱中线坐标X
Hb;#aXHSd Public Const mkW As Integer = 28 '识别标志立柱宽度
Q0_UBm^f Public Const mkH As Integer = 80 ''识别标志立柱高度(上白中黑下白)
Vn6 g(:\w Public Const mkY As Integer = 4 ''识别标志立柱Y坐标(40-79白, 80-119黑,120-159白)
\]W*0t>s Public Const mkX As Integer = PilarC - mkW / 2 '识别标志立柱X坐标
f6ad@2 '车缝检测位置常数
viT/$7`AI Public Const sSize As Long = 32&
xCMcS~
3/ Public Const sPos As Long = 310&
bi bjFg Public Const sPosL As Long = 200&
vo[Zuv?<h Public Const sPosR As Long = 500&
T0ebW
w '车缝检测框位置
Q!:J.J Public Slice(1 To sSize, 1 To FrameH) As Byte
/K"koV; Public SliceL(1 To sSize, 1 To FrameH) As Byte
!;^sIoRPV Public SliceR(1 To sSize, 1 To FrameH) As Byte
afcI5w;>} Public avSL As Integer, avSLR As Integer, avSLL As Integer
N (W;(7 [g:ZIl4p\P _kb
$S Public MKpilar(1 To mkW * mkH) As Byte '一维数组用于亮度对比度分析,比使用二维数组更便于VB编译优化
z5v)~+"1 '该数组用于亮度对比度调节、车辆通过识别与车皮间隔识别
VMUK|pC4K Public BsLine(1 To 4 * FrameW) As Byte, bsAV As Integer '图像的前4行。用于确定标志区的亮度与对比度范围
~ b;%J: Public PilarW As Long, PilarH As Long, PilarX As Long, PilarY As Long
h
p]T ^ Public LeftBK(1 To 1024, 0 To 1) As Byte, RightBK(1 To 1024, 0 To 1) As Byte
SAt{At '前后帧左右上角128列*8行像素块,根据平均值差绝对值判断进车方向
IR,`- Uzb~L_\Rmt MGd 7Ont uf (`I '一次连续采集的帧数
G:QaWqUb Public tFrames As Long
dw8Ce8W M3350 '在采集卡申请的缓存中,是按帧为单位的,每一帧包含奇偶场两场的数据
R*D0A@ '而该卡的硬件设置是按场采集,只需要读第一场的数据即可。
d3AOuVUf '所以要设置的缓存帧的大小是frameW*frameH*2,而一场的数据量为pFrameSize
`2y2Bk $e7dE$eH Public pFRAME(1 To FrameW, 1 To FrameH) As Byte
<8>gb!D G Public pBuffer(1 To FrameW * FrameH * 2) As Byte
'@h5j6:2 Public pWorkSpace(1 To FrameW * FrameH) As Long
>v9 (" Public Const pBufferSize As Long = FrameW * FrameH * 2
Yqy7__vm Public pGray(0 To 255) As Long '整幅图像的灰度直方图
I_IDrS)O Tt.wY=,K Public hBoard As Long '采集卡标识
H\7Qf8s|{ Public mBufferAddr As Long '缓存地址
wPYz&
&W Public BufferSize As Long '缓存大小(字节)
Lc!%
3,#. Public iCurrentCard As Long
QcGyuS.B Public CapStatus As Long
3eqnc),Z Public iFrames As Long
G-[fz Public currentBr As Byte, currentContr As Byte
PYYOC"$ X/fk
&Cp Public hMEM As Long, mStatus As Long
_
a|zvH Public Const hMemSize As Long = pFrameSize * 4
,25Qhz] Public hMemWork As Long
CfA^Xp@vc Public Const hMemWorkSize As Long = pFrameSize * 5
mVN^X/L(y N*N@wJy:5 xZ }1dq8 NZSP*# !B '串口接收轨道衡数据
W~J@[email protected] Public WeightFromCom As String
SNB> Public bReceiveComplete As Boolean
4
e1=b, A=/|f$s+ 18 pi3i[ Public Type GrayBMPHeader
*4;MO2g Tag As Integer
y-gSal FileLength As Long '文件大小
QXnL(z Reserve1 As Long
*wcb 5p DataOffset As Long '图像数据偏移量
V^WR(Q} BMPHeaderSize As Long '文件头长
b/='M`D}#G 'length of the bitmap info header used to describe the bitmap colors, compression,…
L<encPJt 'the following sizes are possible:
C d)j% '28h - windows 3.1x, 95, nt, …
_6"!y
]Q '0ch - os/2 1.x
AXhV#nZt0 'f0h - os/2 2.x
K)c`
G_%G xJ)hGPrAl ImageWidth As Long '图像宽(像素数)
G/Nb@pAy[ ImageHeight As Long '图像高(像素数)
GpV"KVJJ/ PlaneNumber As Integer '图像层数
-ckk2D? bpp As Integer 'bits per pixels '1 - monochrome bitmap
rYbb&z!u '4 - 16 color bitmap
9pD=E>4?# '8 - 256 color bitmap
o/bmS57 '16 - 16bit (high color) bitmap
p=vu<xXtD '24 - 24bit (true color) bitmap
y{ReQn3>y '32 - 32bit (true color) bitmap
)>$@cH Compression As Long '压缩方法 '0 - none (also identified by bi_rgb)
u;m[, '1 - rle 8-bit / pixel (also identified by bi_rle4)
U)%gzXTZ% '2 - rle 4-bit / pixel (also identified by bi_rle8)
2B{~
"< '3 - bitfields (also identified by bi_bitfields)
tY^ MP5* IMAGESIZE As Long '图像数据字节数
6H,n?[zTt hResolution As Long '水平分辩率 像素数/米
sHx>UvN6 vResolution As Long '垂直分辩率
L$^ya%2 ColorsinBMP As Long '图中所用的颜色。对256色图像总为0x100
z{w!yMp" ImportantColors As Long
."<mL}Fi( Pallate(0 To 255) As Long '图像每个值对应的实际显示颜色,项数对应PallateNumber所指调色板项数
8_6\>hW& End Type
vq|o}6Et s)ymm7? lL.3$Rp; ^fT|Wm< Public BMPHeader As GrayBMPHeader, BMP1 As GrayBMPHeader
5_@ u Be~ Public sRECT As RECT
h=uwOi6} !%<bLD8 Ly1V@ Public conn As ADODB.Connection
&R:$h*Wt| Public rsTrain As ADODB.Recordset
\*Roa&<! Public rsOperater As ADODB.Recordset
E(F<shT# Public rsGoods As ADODB.Recordset
2yk32| Public rsGood2 As ADODB.Recordset
a%a_sR\) Public rsSender As ADODB.Recordset
h0ufl.N_% Public rsReceover As ADODB.Recordset
|[/[*hDZ9 Public rsTrainTMP As ADODB.Recordset
n$n)!XL/ m0+X 109 u6{=Z : '打开采集卡
z;GR(;w/ '设置参数
| X/QSL '设置为实时单帧采集到缓存方式
;q&6WO '由另一线程查询采集状态,如果完成采集,传送至用户数组分析或保存
D3s]49j) 7yGc@kJ? S3rN]!B+ Sub Main()
hm"i\JZ3N Dim i As Integer, status As Long
]5X=u(} }=CL/JHz InitBMPinfo
[m3[plwe '生成BMP文件头---该文件头是固定将pFRAME数组写成BMP文件
<QoSq'g#,= BMPHeader.Tag = &H4D42
E? 1"&D
m BMPHeader.ImageWidth = FrameW
rcUXYJCh- BMPHeader.ImageHeight = FrameH
[;3` Aw BMPHeader.BMPHeaderSize = &H28
;*K@8GnU BMPHeader.PlaneNumber = 1
zWYm*c"n\ BMPHeader.bpp = 8
AV\6K;~ BMPHeader.Compression = 0
G j^J pG BMPHeader.hResolution = &H1274 'Windows pBrush.exe的默认值,PhotoED.exe默值为0
!e?g"5r{Bv BMPHeader.vResolution = &H1274
J0@<6~V6o BMPHeader.ColorsinBMP = 256
]3Z?Q BMPHeader.ImportantColors = BMPHeader.ColorsinBMP
x#ub % t BMPHeader.DataOffset = Len(BMPHeader)
#?/&H;n_8S For i = 0 To 255
Fdsaf[3[v BMPHeader.Pallate(i) = RGB(i, i, i)
EY=`/~|c Next i
SXfuPM BMPHeader.IMAGESIZE = FrameH * FrameW
#jAlmxN BMPHeader.FileLength = Len(BMPHeader) + BMPHeader.IMAGESIZE
B -XM(Cj x9Veg4Z7 MYgh^%w: MoveMemory BMP1, BMPHeader, Len(BMPHeader)
1
oq5|2p 42X N*br BMP1.ImageWidth = FrameW
$
Fx:w BMP1.ImageHeight = FrameH * 2
jU\vg;nr BMP1.IMAGESIZE = BMP1.ImageWidth * BMP1.ImageHeight
\~|+*^e) BMP1.FileLength = Len(BMP1) + BMP1.IMAGESIZE
<smi<syx Gq_rZo(@ '确定标志位置,为pilarX, pilarY确定初始值
q 65mR!) PilarW = mkW
`NqX{26GV+ PilarH = mkH '此两项为固定值
56 k89o PilarX = GetSetting(App.EXEName, "Mark", "MarkX", mkX)
\ 8v{9Yb PilarY = GetSetting(App.EXEName, "Mark", "MarkY", mkY) '此两项需要在程序初始化时检查并进行调整
o";5@NH k*)O]M<, wg<UCmfu! '连续采集记录文件
tW4|\-E"s4 ' 建立一个缓冲区为页对齐方式的文件
8zv=@`4@G If Dir(TmpFile) <> "" Then
(\^| @ hFile = CreateFile(TmpFile, GENERIC_READ Or GENERIC_WRITE, _
n]$50_@ 0&, 0&, OPEN_ALWAYS, FILE_FLAG_NO_BUFFERING, 0&)
=SJwCT0; ' 在95/98中,如果打开文件时没有声明overlapped方式,在读定文件时就不能使用overlapped参数项
gFR9!=,/V% ' 而必须用setfilepointer函数调节与操作系统保留的文件指针。
+L(0R&C Else
wLyQ <[$ hFile = CreateFile(TmpFile, GENERIC_READ Or GENERIC_WRITE, _
VhdMKq~` 0&, 0&, CREATE_ALWAYS, FILE_FLAG_NO_BUFFERING, 0&)
P%`|Tu!B End If
Ml`tDt|; If hFile = 0 Then
fx&b*OC MsgBox TmpFile & ": File Open Error", vbOKOnly
jiS|ara" Exit Sub
:<$B o End If
*7: )k '采集参数记录文件
4 [2^#t[ hBCFile = FreeFile()
_&!%yW@ Open TmpFile + ".BC" For Binary Access Read Write As #hBCFile
!QK~l 6[g~p< 8n} hMEM = VirtualAlloc(ByVal 0&, hMemSize, MEM_COMMIT, PAGE_READWRITE) ’分配系统内容
~Pq(Ta If hMEM = 0 Then
6% +s` fStatus = GetLastError
X2>qx^jT MsgBox "内存分配错误: 错误代码 - " & Str(fStatus) & vbCrLf _
u~MD?!LV & "请向技术人员报告该错误代码。", vbOKOnly
gd~# uR\ CloseHandle hFile
Jj=0{(X Exit Sub
F/c
7^ End If
&?\
'Z~B4 KLqn`m`O; hMemWork = VirtualAlloc(ByVal 0&, hMemWorkSize, MEM_COMMIT, PAGE_READWRITE)
LgN\%5f- If hMemWork = 0 Then
$F V!HD fStatus = GetLastError
(#6E{@eq MsgBox "内存分配错误: 错误代码 - " & Str(fStatus) & vbCrLf _
'BY{]{SL & "请向技术人员报告该错误代码。", vbOKOnly
x8H%88!j* '释放已成功分配的内存
NHKIZx8sR mStatus = VirtualFree(ByVal hMEM, hMemSize, MEM_DECOMMIT)
WVaIC $Y mStatus = VirtualFree(ByVal hMEM, 0&, MEM_RELEASE)
6*3J3Lc_< Q2[@yRY/z CloseHandle hFile
~ KNdV Exit Sub
t[Dg)adc End If
So &c\Ff $6\-8zNk ' Test writing
Ul@Jg
'WriteFile hFile, ByVal hMEM, ByVal 4096&, bytesRW, ByVal 0&
e_3KNQ`kA d5?"GFy '初始化采集卡参数
8SmtEV[b3 iCurrentCard = -1
\wW'Hk= hBoard = okOpenBoard(iCurrentCard)
fNz*E|]8& Debug.Print hBoard
hZ_0lX} If hBoard = 0 Then
P} =eR ExitGrabber
)U4h?J End
moO=TGG;F End If
a o_A%?Ld okGetBufferSize hBoard, mBufferAddr, BufferSize
.{6?%lt If mBufferAddr = 0 Then
JN;92|x MsgBox "缓存不存在!"
uM3F[p%V^ ExitGrabber
-cW`qWbd End If
dxm_AUM Debug.Print Hex(mBufferAddr), Hex(BufferSize)
9y/gWE /9/svPc] \Kh@P*7 currentBr = 128: currentContr = 128
\@]/ks=K '设置视频输入参数
Of|e]GR okSetVideoParam hBoard, VIDEO_SOURCECHAN, 1 'Video2
GtZkzVqLd ' lParam=0,1.. Comp.Video; 0x100,101...to Y/C(S-Video), 0x200,0x201 to RGB Chan.Input
OE,uw2uaT okSetVideoParam hBoard, VIDEO_BRIGHTNESS, currentBr '亮度
XI6LPA0% okSetVideoParam hBoard, VIDEO_CONTRAST, currentContr '对比度 ---初始设置条件下如果图像亮度达不到基本要求则控制灯光
YDEUiZ~ okSetVideoParam hBoard, VIDEO_RGBFORMAT, FORM_GRAY8 '8位灰度模式
yP :/F|E$ okSetVideoParam hBoard, VIDEO_TVSTANDARD, 0 'PAL制式
A)I4 `3E okSetVideoParam hBoard, VIDEO_SIGNALTYPE, &H10000 '逐行(低字)同步开槽(高字)
/0 |niiI okSetVideoParam hBoard, VIDEO_RECTSHIFT, 144 + &H2C0000 '有效区起始位置:高字Y偏移,低字X偏移 (144/44经验值)
V,>_L okSetVideoParam hBoard, VIDEO_AVAILRECTSIZE, FrameW + FrameH * 2 * &H10000 '有效区大小:低字X高字Y (768/576采集卡最大值)
$.Fti-5 okSetVideoParam hBoard, VIDEO_FREQSEG, 0 ' 低频部分信号
nsChNwPX "X/cG9Lw '设置采集参数
cZ$!_30N+ okSetCaptureParam hBoard, CAPTURE_INTERVAL, 0 '逐帧
6*@\Qsp615 okSetCaptureParam hBoard, CAPTURE_CLIPMODE, 2 '裁剪方式
7/c[ f okSetCaptureParam hBoard, CAPTURE_BUFRGBFORMAT, FORM_GRAY8 '8位灰度
"]BefvE okSetCaptureParam hBoard, CAPTURE_HARDMIRROR, 0 '不作镜像变换
/rRQ*m_ okSetCaptureParam hBoard, CAPTURE_FRMRGBFORMAT, FORM_GRAY8 '帧存格式
" bHeNWZ okSetCaptureParam hBoard, CAPTURE_SAMPLEFIELD, 0 ' 逐场采集
/($!("b okSetCaptureParam hBoard, CAPTURE_HORZPIXELS, 944 '水平像素数 PAL制式固定值
w3j51v` 0' okSetCaptureParam hBoard, CAPTURE_VERTLINES, 625 '垂直线数
rx^vh%/
Q! okSetCaptureParam hBoard, CAPTURE_SEQCAPWAIT, 0 '不等结束立即返回
*ml&}9 'okSetCaptureParam hBoard, CAPTURE_BUFBLOCKSIZE, FrameW + FrameH * 2 * &H10000
pPztUz/. 'Buffer Block Size不用设置,而用okSetTargetRect函数进行动态调节
1iOQ8hD *h ~Y=#`8* 6 isz okCloseBoard hBoard
.BLF7>
M1 Sleep 50
,,+ ~./) hBoard = okOpenBoard(iCurrentCard) '关闭后重新打开使新的设置值生效
f@roRn8p? :v/6k '设置数据传送方式
)IIQ{SwQq 'okSetConvertParam hBoard, CONVERT_FIELDEXTEND, FIELD_COPYEXTEND '逐行并扩展行
]s
lYr8m '该设置对本程序无意义,因为程序直接用CopyMemory方法读缓存,而扩展行方式是在用采集卡内置函数读RECT过程中实现的。
@d5G\1(% UloZo?
e` sRECT.Right = -1 '用于获得当前设置值
rVLUT iFrames = okSetTargetRect(hBoard, BUFFER, sRECT)
i*16kdI. Debug.Print sRECT.Left, sRECT.Right, sRECT.Top, sRECT.Bottom
D}
Jhg`9 Debug.Print okSetCaptureParam(hBoard, CAPTURE_BUFBLOCKSIZE, -1) 'FrameW + FrameH * &H10000
$#V^CmW. sRECT.Left = 0
F">>,Oc)U" sRECT.Top = 0
!A>VzW sRECT.Right = sRECT.Left + FrameW
@ucN|r}=R sRECT.Bottom = sRECT.Top + FrameH * 2
pa0'\ iFrames = okSetTargetRect(hBoard, BUFFER, sRECT)
mPR(4Ol. %y
zFWDg sRECT.Right = -1 '检查新设置值
{V&
2k9* iFrames = okSetTargetRect(hBoard, BUFFER, sRECT)
ag6hhkjA Debug.Print sRECT.Left, sRECT.Right, sRECT.Top, sRECT.Bottom
r30t`o12i Debug.Print Hex(okSetCaptureParam(hBoard, CAPTURE_BUFBLOCKSIZE, -1))
M,Y lhL ypxqW8Xe If TESTSignal = False Then
U].u) g$ 'ExitGrabber
,6[}qw)* End If
o6e6Jw \-c8/= kqYvd]ss B"O5P> '设为实时采集状态
8.ek_r 'iFrames = okCaptureActive(hBoard, BUFFER, 0&)
_#c
^z;! a$p2I+l
X s^_E'j$ '单帧采集
&JoMrcEZ 'okWaitSignalEvent hBoard, EVENT_FRAMEHEADER, -1
#k%3Ag
'iFrames = okCaptureSingle(hBoard, BUFFER, 0&)
)N
QtjB$ okCaptureTo hBoard, BUFFER, 0, 1 'single
nU"V@_?\ 'Do While okGetCaptureStatus(hBoard, False) <> 0
a7G0 ' Sleep 20
:j/PtNT@ 'Loop
4_,l[BhsQG okGetCaptureStatus hBoard, True
c"+N{$ vp MoveMemory pFRAME(1, 1), ByVal mBufferAddr, pFrameSize
M4a-+T" '写入768*576测试图象
],r?]> ArrayToBMP TmpBMP
xNt -C$Z%I7 0 '打开数据库
x/$s:[0B# Set conn = New ADODB.Connection
02]9OnWw conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
cK.T=7T "Persist Security Info=False;Data Source=" & "c:\train\train.mdb" & _
<DS+"# "; Mode=Read|Write"
UXB[3SP conn.Open
9E{Bn# qlUYu"`i frmRecord.Picture1.Picture = LoadPicture(TmpBMP)
\mZ\1wzn'{ frmRecord.Visible = True
5G8
`zy frmQuery.Visible = True
A%u@xL,_ Load frmReceiveFromComm
[c?']<f4 SM:SxhrGt '调试参数
0D1yG(ck If InStr(UCase(Command()), "/CAPTURE") > 0 Then
ZIAiVq2) SignalBox.Visible = True
Xq&x<td End If
x>Ah4ad If InStr(UCase(Command()), "/COMM") > 0 Then
YBgHX [q frmReceiveFromComm.Visible = True
Y[8w0ve-g End If
g
j`"| Fz+0 h" End Sub
nbYkr*: "t pk'@!|g%= Sub ExitGrabber()
U5mec167
'关闭数据库
FAu G`zu '关闭采集卡
~Z5?\a2Ld mStatus = VirtualFree(ByVal hMEM, hMemSize, MEM_DECOMMIT)
:)nn/[>fC mStatus = VirtualFree(ByVal hMEM, 0&, MEM_RELEASE)
T6f{'.w mStatus = VirtualFree(ByVal hMemWork, hMemWorkSize, MEM_DECOMMIT)
t"1'B!4 mStatus = VirtualFree(ByVal hMemWork, 0&, MEM_RELEASE)
to Ei4u)m okStopCapture hBoard
&/lJ7=Nq okCloseBoard hBoard
d#T8|#O" CloseHandle hFile
n<:/ X tE Close #hBCFile
'3uj6Wq2 conn.Close
zx\N^R;Jq End
P9J3Ii! End Sub
9d2#=IJm >vg!<%]W
] Function ArrayToBMP(ByVal File As String)
[|{yr Dim BytesWrite As Long
`$`:PT\Zv4 MBCA%3z08 hTmpFile = CreateFile(File, GENERIC_READ Or GENERIC_WRITE, 0&, 0&, _
P f oAg* CREATE_ALWAYS, 0&, 0&)
5| 2B@6- 8eP2B281 If hTmpFile = 0 Then
uPe4Rr ArrayToBMP = False
0_bt*.wI+ Exit Function
aDa}@-F&a End If
S=lA^#'UdX z)5n&w
S SetFilePointer hTmpFile, 0&, 0&, FILE_BEGIN
okX\z[X WriteFile hTmpFile, BMPHeader, 2&, BytesWrite, ByVal 0&
8xmw-s) SetFilePointer hTmpFile, 2&, 0&, FILE_BEGIN
U'LO;s04m WriteFile hTmpFile, BMPHeader.FileLength, Len(BMPHeader) - 2, BytesWrite, ByVal 0&
G?QFF6)}! 3m4?l
~ SetFilePointer hTmpFile, Len(BMPHeader), 0&, FILE_BEGIN
k>{i_`* WriteFile hTmpFile, pFRAME(1, 1), pFrameSize, BytesWrite, ByVal 0&
I=hgfo @M4~,O6- If BytesWrite < pFrameSize Then
Sm#;fx+ ArrayToBMP = False
bIizh8d? End If
mM~!68lR 7|6tH@4Ub CloseHandle hTmpFile
K G~](4JE( *Rshzv[ End Function
%dZD;Vhg c>
K/f7 Function ArrayToBMP1(ByVal File As String)
.Gl&K|/{j 9Q :IgY?T Dim BytesWrite As Long
|aN0|O2 tBG :ECUL hTmpFile = CreateFile(File, GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0&, _
!mL,Ue3/ CREATE_ALWAYS, 0&, 0&)
fRT:
@lV xy$FS0u If hTmpFile = 0 Then
\E.t=XBn ArrayToBMP1 = False
<Q=ES,M Exit Function
5fb,-`m. End If
~0?p @8 5h[u2&;G SetFilePointer hTmpFile, 0&, 0&, FILE_BEGIN
}M/w 0U0o WriteFile hTmpFile, BMP1, 2&, BytesWrite, ByVal 0&
L4sN)EI QN-n9f8 SetFilePointer hTmpFile, 2&, 0&, FILE_BEGIN
k`js~/Xv WriteFile hTmpFile, BMP1.FileLength, Len(BMP1) - 2, BytesWrite, ByVal 0&
6K P!o MCQ>BP SetFilePointer hTmpFile, Len(BMP1), 0&, FILE_BEGIN
)T#;1qNB WriteFile hTmpFile, pBuffer(1), pBufferSize, BytesWrite, ByVal 0&
^Gv<Xl ,@!8jar@w} If BytesWrite < pBufferSize Then
c
i7;v9 ArrayToBMP1 = False
nx=#QLi End If
K_`*ZV{r iCN@G&rVw CloseHandle hTmpFile
2Z@<llsi $E|W|4N End Function
uGl0z79 <Xy8}Z`s '使用该过程建立的文件要求在用后关闭
-/ Public Function ArrayToBMP2(File As String) As Boolean
!U>"H8}dv N(&FATZUW Dim BytesWrite As Long
Xkl^!, /db?ltb ArrayToBMP2 = True
J+\F)k>r D4'?
V
Iz hTmpFile = CreateFile(File, GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0&, _
T-&CAD3 ,O CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY, 0&)
8<P $E! r _xo>y~S If hTmpFile = 0 Then
'*>LZo4 ArrayToBMP2 = False
(Wq9YDD@ Exit Function
|[K7oa~# End If
TFxb\ `P/* x[? SetFilePointer hTmpFile, 0&, 0&, FILE_BEGIN
=[{Pw8[' WriteFile hTmpFile, BMPHeader, 2, BytesWrite, ByVal 0&
j`BFk> i*_KHK SetFilePointer hTmpFile, 2&, 0&, FILE_BEGIN
kRiWNEw WriteFile hTmpFile, BMPHeader.FileLength, Len(BMPHeader) - 2, BytesWrite, ByVal 0&
R)cns7oW W~k!qy ` SetFilePointer hTmpFile, Len(BMPHeader), 0&, FILE_BEGIN
'! 1ts @ WriteFile hTmpFile, pFRAME(1, 1), pFrameSize, BytesWrite, ByVal 0&
^&&dO*0{ -xXNzC If BytesWrite < pFrameSize Then
K?[pCF2C ArrayToBMP2 = False
zwU8i VDe End If
NG'VlT %~p_bKd~ CloseHandle hTmpFile
,_rarU)[J @+1E|4L1vf End Function
4Bx1L+Cg d?N"NqaN Private Function TESTSignal() As Boolean
8kJ k5 Dim extsign As Long, videotype As Long, scanlines As Long, fieldfrq As Long
RMC|(Q< }C*o;'o5G extsign = okGetSignalParam(hBoard, SIGNAL_VIDEOEXIST)
S$+ v? Y`) T|.Q81.NE If extsign = 1 Then
#j-,#P@ TESTSignal = True
";s5It
Else
)SA$hwR If extsign = 0 Then
%hrv~= MsgBox "无视频输入信号,检查摄像机电源!", vbOKOnly
+1d\ZZA|6& TESTSignal = False
+8^9:w0} Exit Function
1A E/ILGo End If
YfMe69/0I End If
20?i4h_ F5
LQgK-z '测试视频输入类型
f=K1ZD 'video type
-&)^|Atm okWaitSignalEvent hBoard, EVENT_ODDFIELD, 40
h!K
B%4V videotype = okGetSignalParam(hBoard, SIGNAL_VIDEOTYPE)
`zzX2R Je If videotype = 1 Then
o95O!5 hl '"隔行信号(Interlaced)"
MCh8Q|Yx4 Else
{+xUAmd If videotype = 0 Then
Qmn5umd=?\ '"逐行信号(Non-interlaced)"
,xD{A}}
V Else
Z~ ?:r If videotype = -1 Then
1xguG7 ' "不支持"
k 5 "3* End If
)sV#
b End If
3]N}k|lb% End If
G)#
,39P h*MR5qa '测试垂直扫描线数
tB_ V%qH
'video scanlines
S_bay8L1 scanlines = -1
e982IP scanlines = okGetSignalParam(hBoard, SIGNAL_SCANLINES)
W$'pUhq\H If scanlines = -1 Then
-m|b2g}"3 ' "不支持"
l42m81x" Else
J $e.$ah; 'Trim(Str(ScanLines)) + " 行数/幅"
CzvlZDo End If
w|L~+
N7oMtlvL[w '测试帧频
On'3K+(_ 'video field frequency
?G?=,tV fieldfrq = okGetSignalParam(hBoard, SIGNAL_FIELDFREQ)
J.<eX=< If fieldfrq = -1 Then
p,tB 'lblSignal(8) = "不支持"
i[\[xfk Else
=rBFMTllM 'lblSignal(8) = Trim(Str(FieldFRQ)) + " 场数/秒"
22BJOh
End If
,xTbt4J End Function
}2NH>qvY raqLXO!j U~H'c
p Sub PicIdentify()
d:pp,N~2o '本程序完成从文件中按顺序读出一幅图像并完成图像识别
21o_9=[^ '根据固定位置判断透过车皮连接处接收的对面的立柱影像。出现立柱后该帧前1-2帧与后1-2帧分别为车号信息与车皮信息
"~V}MPt '判定标准:如果在立柱位置上有明显的模式反差,则视为车皮之间的间隔
"L8V!M_e '方法:对立柱标志区进行平均值二值化,面积为32*40,亮区(255)与暗区(0)的亮度平均值理论差大于200倍,实际差值应不小于100倍
\^#1~Kx HO@T2t[ Dim fPTR As Long, cFrame As Long
BB%(!O4Dl Dim i As Long, j As Integer, pTotal As Long, pAV As Integer
L//sJe gE
,j\M* Ap!UX=HBb cFrame = 0
COHJJONR 8fe"#^"s R mKsj7 Do While cFrame < tFrames
tjd"05"@: }MIH{CMH fStatus = SetFilePointer(hFile, cFrame * pFrameSize, 0&, FILE_BEGIN)
ESomw fStatus = ReadFile(hFile, ByVal hMEM, ByVal pFrameSize, bytesRW, ByVal 0&)
ZH0f32K MoveMemory pFRAME(1, 1), ByVal hMEM, pFrameSize
3LXpe8$lJ b8]oI"&G