2012-08-27 3 views
1

큰 이미지와 작은 이미지간에 검색을 수행하기 위해 Pixel을 사용하는 과정에있었습니다. 그 중 하나가 성공적으로 작동하지만 내가 원하는 것을하기 위해 lockbit 버전을 얻는 데 문제가 있습니다.이미지 인식 두 이미지 사이 vb.net Lockbits

주먹 큰 이미지를 통해 작은 이미지의 첫 번째 픽셀을 찾는 루프를 반복하고 싶습니다. 그런 다음 한 번 정확하게 첫 번째 픽셀을 찾아서 수학 공식을 사용하여 정확도의 백분율을 알려줍니다. 이렇게하면 큰 이미지 내부의 작은 이미지의 첫 번째 픽셀 (맨 위 왼쪽)에서 화면의 해당 위치로 마우스를 이동하는 기준을 충족시키는 경우 높은 성공률로 작동하며 GetPixel 형식에 비해 매우 빠릅니다.

문제 작은 이미지의 시작 픽셀이있는 위치의 큰 이미지에서 위치를 가져올 수없고 마우스를 해당 위치로 이동할 수 없습니다.

   Try 
     Dim ifnd As Boolean = False 
     Dim PreviousX As Integer 
     Dim PreviousY As Integer 
     PreviousX = MousePosition.X 
     PreviousY = MousePosition.Y 
     Dim MatchCount As Integer = 0 



     Dim oX As Integer = 0 
     Dim oi As Integer = 0 
     Dim iX As Integer = 0 
     Dim iY As Integer = 0 
     Dim bmp_original As Bitmap 
     Dim ImG As Bitmap 
     ImG = PictureBox2.BackgroundImage 
     bmp_original = ImG 
     Dim bmp_large As Bitmap 
     Dim SmG As Image 
     SmG = PictureBox1.BackgroundImage 
     bmp_large = SmG 
     Dim bmg As Bitmap 
     'large image 
     ImG = BBt 
     'small image 
     bmg = Abt 
     Thread.Sleep(1000) 
     'large image 
     If BBt Is Nothing Then 
      Dim xbit As Bitmap = New Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height) 

      Dim g As Graphics = Graphics.FromImage(xbit) 
      BBt = xbit 
      g.CopyFromScreen(0, 0, 0, 0, Screen.PrimaryScreen.Bounds.Size) 
      g.Dispose() 
      Thread.Sleep(2000) 
     End If 

     'small image 
     PictureBox5.BackgroundImage = Abt 
     'large image 
     PictureBox6.BackgroundImage = BBt 
     'For value As Integer = 0 To 5 
     'For value As Integer = 10 To 0 Step -2 
     Thread.Sleep(1000) 
     'original image 
     Dim oRect As New Rectangle(0, 0, bmg.Width, bmg.Height) 
     Dim oBmpData As BitmapData = bmg.LockBits(oRect, ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format24bppRgb) 
     Dim oPtr As IntPtr = oBmpData.Scan0 
     Dim oPixels(99) As Integer 
     Dim oMaxPix As Integer = bmg.Width + bmg.Height 
     Marshal.Copy(oPtr, oPixels, 0, oMaxPix) 
     Dim smWidth As Integer 
     smWidth = bmg.Width - 1 
     'small image 
     PictureBox3.BackgroundImage = bmg 
     'large image 
     Dim lRect As Rectangle = New Rectangle(0, 0, bmp_large.Width, bmp_large.Height) 
     Dim lBmpData As BitmapData = ImG.LockBits(lRect, ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format24bppRgb) 
     Dim lPtr As IntPtr = lBmpData.Scan0 
     Dim PixelCount As Integer = ImG.Width * ImG.Height 
     Dim lPixels(PixelCount - 1) As Integer 
     Marshal.Copy(lPtr, lPixels, 0, PixelCount) 
     'large image 
     PictureBox4.BackgroundImage = ImG 

     Dim MathScore As Integer 
     Dim MaxScore As Integer = bmg.Height 

     'beginning of Marshal Loop 
     For i As Integer = 0 To lPixels.GetUpperBound(0) 

      If oPixels(0) = lPixels(i) Then 
       'we have a match for top left pixel - so compare the other pixels 
       Dim PixelsToLeft As Integer = (i Mod ImG.Width) - 1 'pixels to left of 10by10 section of large image 
       Dim PixelsToRight As Integer = ImG.Width - PixelsToLeft - smWidth 'pixels to right of 10by10 section of large image 
       Dim d As Integer = PixelsToLeft + PixelsToRight 'array distance between right edge of 10by10 section and left edge of next row 

       For y As Integer = 0 To 9 
        For x As Integer = 0 To 9 
         Dim oIndex As Integer = (y * 10) + x 
         Dim lIndex As Integer = (i + (y * (d + smWidth))) + x 
         If oPixels(oIndex) = lPixels(lIndex) Then 
          MathScore = MathScore + 1 
          xx = oPixels(0) + 2 
          yy = lPixels(i) + 3 
          SetCursorPos(xx, yy) 
         End If 

        Next 



       Next 
       If MathScore >= Val(MaxScore/2.5) Then 
        SetCursorPos(xx, yy) 
        Dim percent As String 
        Dim myDec As Decimal 
        'inttemp = (intData2 * 100)/intData1 
        myDec = Val((MathScore * 100)/MaxScore) 
        myDec = FormatNumber(myDec, 0) 
        percent = myDec & "%" 
        Label16.Text = "Match Score: " & percent 
        Label17.Text = "Math Score: " & MathScore & " out of " & MaxScore 
        Me.ToolStripStatusLabel2.Text = "Completed" 
        Me.Button4.Enabled = True 
        GoTo Foundit 
       End If 
      End If 
     Next 
     PictureBox1.Image = (Abt) 
     PictureBox2.Image = (BBt) 
     ImG.UnlockBits(oBmpData) 
     bmg.UnlockBits(lBmpData) 

Foundit : mouse_event (MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) mouse_event (MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) 캐치 끝 이제

을 시도 아래 코드는 화면에서 마우스를 움직이는 방법을 알아낼 수 있다면 알아낼 수있을 것입니다. 불행히도 나는 성공하지 못해 며칠 동안이 작업을 해왔습니다. 당신이 도와 주시면 감사하겠습니다. 미리 감사드립니다.

답변

0

마우스가이

dim a as new point 
a.x = "the number you want" 
a.y = "the number you want" 
windows.forms.cursor.position = a 
을 이동