小弟做一个视频处理软件,使用摄像头采集视频图像,定时截取视频画面,前后两次对比图像,判断是否有变化。具体的做法是:
1、编写视频采集程序,实现视频图像采集,这点我已实现。
2、定时截取视频画面,我使用BitBlt实现了
3、对比两副图片的变化,现在没有好的办法,所以特请各位高手门帮帮忙,拜谢!!!
简单的说就是如何判断两副图片是否一样,简单高效些的。

解决方案 »

  1.   

    二值化后再比较的思路很简单难点在于比较图片的形状,据说要用Snack算法。这个有点难。国内做的好的不多。IBM做的据说不错。
      

  2.   

    一个颜色值可以拆分成 RGB 三部分;两个颜色值比较就是两组 RGB 比较,如果 RGB 各自的差值都小于某个粒度,就可以认为相似。
      

  3.   

    这个很难比较,如从哪个点开始相象时比较,确实需要更好的算法.下面给个理想状态下的比较供参考
    Picture1和Picture2分别加载图象供比较    Dim n As Long, k As Single, b As Long
        b = 100 '不必每个点都比较,跳着选取
        For y = 0 To Picture1.ScaleHeight - 1
            For x = 0 To Picture1.ScaleWidth - 1 Step b
                '颜色接近,误差正负5
                If Abs(Picture1.Point(x, y) - Picture2.Point(x, y)) < 5 then
                      n = n + 1
                    k = Round(n / (Picture1.ScaleHeight * Picture1.ScaleWidth), 4)
                    If k >= 0.1 / b Then
                        Label1.Caption = "颜色相似度:" & Round(k * 100 * b, 2) & "%"
                        DoEvents
                    End If
                End If
                
            Next x
        Next y
        MsgBox "比较完成,颜色相似度:" & Round(k * 100 * b, 2) & "%"
      

  4.   

    http://www.codeproject.com/KB/GPU-Programming/cubgs.aspx
      

  5.   

    比较的方案我想采用赵老虎的方案,但现在有一个问题,我想把摄像头的图像通过BitBlt复制到内存中,这个如何实现?我使用BitBlt复制图像到PictureBox中没有问题,但是想在内存中创建一个设备场景,用来存储截取的视频图像总是不成功,希望高人指点
      

  6.   


    Private Sub tmrP_Timer()
        Dim lngP As Long
        Dim bytOneRed As Integer
        Dim bytOneGreen As Integer
        Dim bytOneBlue As Integer
        Dim bytTwoRed As Integer
        Dim bytTwoGreen As Integer
        Dim bytTwoBlue As Integer
        Dim bolP As Boolean
        dim lngW as long 
        dim lngH as long 
    On Error GoTo errSub
        'picS:源图像
        'picOne:第一副截图
         'picTwo:第二副截图
         lngW=picS.Width
        lngH=picS.Height
        lngP = BitBlt(picTwo.hdc, 0, 0, lngW, lngH, picOne.hdc, 0, 0, SRCCOPY)
        lngP = BitBlt(picOne.hdc, 0, 0, lngW, lngH, picS.hdc, 0, 0, SRCCOPY)
        '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        
        
        lngP = GetPixel(picOne.hdc, 50, 50)
        txtColorOne.Text = lngP
        bytOneRed = lngP Mod &H100
        bytOneGreen = (lngP \ &H100) Mod &H100
        bytOneBlue = lngP \ &H10000    lngP = GetPixel(picTwo.hdc, 50, 50)
        txtColorTwo.Text = lngP
        bytTwoRed = lngP Mod &H100
        bytTwoGreen = (lngP \ &H100) Mod &H100
        bytTwoBlue = lngP \ &H10000    txtRed.Text = Abs(bytOneRed - bytTwoRed)
        txtGreen.Text = Abs(bytOneGreen - bytTwoGreen)
        txtBlue.Text = Abs(bytOneRed - bytTwoRed)    If Abs(bytOneRed - bytTwoRed) < 10 And Abs(bytOneGreen - bytTwoGreen) < 10 And Abs(bytOneBlue - bytTwoBlue) < 10 Then
             Me.Caption = "图像相似"
        else
             Me.Caption = "图像不相似"
        End If
        Exit Sub
    errSub:
    End Sub