+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13

Contare pixel

  1. #1
    L'avatar di Psycho
    Psycho non  in linea Scolaretto
    Salve,
    Ho bisogno di realizzare una funzione che mi conti i pixel in una determinata area.
    Spiego meglio a che mi serve.

    Allora dopo aver "calibrato o impostato" che n-pixel corrispondono a n-mm (millimetri)
    voglio caricare una foto in un controllo picture o image e selezionare l'area interessata cos da avere la lunghezza espressa in mm.

    Esempio faccio la foto ad una biglia d'acciaio e poi traccio una linea in modo da selezionare n-pixel e ricavarmi il diametro.

    Spero che mi sono spiegato abbastanza e che c' un modo per fare ci.

    Quindi vorrei un consiglio perch non ho prorpio idea da dove incominciare

    GRAZIE
    ℹ️ Leggi di pi su Psycho ...

  2. #2
    L'avatar di Ste
    Ste
    Ste non  in linea Scolaretto
    Quote Originariamente inviato da Psycho
    Salve,
    Ho bisogno di realizzare una funzione che mi conti i pixel in una determinata area.
    Spiego meglio a che mi serve.

    Allora dopo aver "calibrato o impostato" che n-pixel corrispondono a n-mm (millimetri)
    voglio caricare una foto in un controllo picture o image e selezionare l'area interessata così da avere la lunghezza espressa in mm.

    Esempio faccio la foto ad una biglia d'acciaio e poi traccio una linea in modo da selezionare n-pixel e ricavarmi il diametro.

    Spero che mi sono spiegato abbastanza e che c'è un modo per fare ciò.

    Quindi vorrei un consiglio perchè non ho prorpio idea da dove incominciare

    GRAZIE
    Se vuoi fare una cosa semplice potresti fare così:

    - Imposti la scala dell'immagine su Pixel

    - Al primo click sull'immagine ti salvi x ed y sull'evento MouseDown (controlla che sia stato premuto il Button 1)

    - Al secondo click calcoli la distanza tra i 2 punti

    Altrimenti se desideri estrarre una porzione di immagine:

    dichiare queste due funzioni
    Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
    Private Declare Function SetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long
    
    dopodichè la chiamata alla funzione

    Call SetPixel(Immagine.hdc, X, Y, Colore)
    
    non fa altro che impostare il colore del pixel di coordinata X,Y della picturebox di nome Immagine, il colore deve essere di tipo Long, altrimenti se ti è più comodo puoi utilizzare la funzione RGB che ti ritorna il Long corrispondente ad una determinata combinazione di colori

    Per esempio
    Call SetPixel(Immagine.hdc, 50, 50, RGB(122, 334, 434))
    
    La chiamata alla funzione GetPixel , come si intuisce dal nome ritorna il 'codice' del colore del pixel di coordinate X,Y

    Per esempio:
    Colore = GetPixel(Immagine.hdc, X, Y)
    
    assegnerà alla variabile Colore (di tipo Long) il codice del colore di quel pixel

    ---------------

    A questo modo dovresti avere gli strumenti necessari per procedere ad estrarre un settore dell'immagine, prova per esempio a crearti un form con 2 picture box, in una ci carichi un immagine a piacere l'altra lasciala vuota.

    Da codice prova a copiare l'immagine da una picturebox all'altra (non usare Picture1.Picture = Picture2.Picture ! sennò non vale! ), utilizzando queste 2 funzioni, successivamente puoi provare ad estrarre solo una parte di immagine.

    Ciau

  3. #3
    L'avatar di Psycho
    Psycho non  in linea Scolaretto
    Quote Originariamente inviato da Ste
    Se vuoi fare una cosa semplice potresti fare cos:

    - Al primo click sull'immagine ti salvi x ed y sull'evento MouseDown (controlla che sia stato premuto il Button 1)

    - Al secondo click calcoli la distanza tra i 2 punti
    Scusa la mia ignoranza... potresti farmi un esempio...
    Non sono riuscito a ricavare x e y dall'evento mouseDown.....

    GRAZIE per l'interesse
    ℹ️ Leggi di pi su Psycho ...

  4. #4
    L'avatar di Ste
    Ste
    Ste non  in linea Scolaretto
    Non so per esempio dichiari queste variabili valide per tutto il form

    Dim isFirstClick As Boolean
    Dim X1 As Integer
    Dim X2 As Integer
    Dim Y1 As Integer
    Dim Y2 As Integer
    
    Dopodich all'evento MouseDown

    Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
        
        If Button = 1 Then
            
            If isFirstClick = False Then
                X1 = X
                Y1 = Y
            Else
                X2 = X
                Y2 = Y
                MsgBox "La distanza fra i due punti : " & GetDistance & " mm", vbInformation, "Distanza Punti"
                isFirstClick = False
            End If
        
        End If
        
    End Sub
    
    La funzione GetDistance devi farla tu calcolando algebricamente la distanza fra due punti in un piano, attento per che X ed Y sono in realt Left e Top, quindi devi ragionare diversamente rispetto a 'normali' coordinate

    Ciau

  5. #5
    L'avatar di TheTruster
    TheTruster non  in linea Moderatore Globale Ultimo blog: Mouse Wheel in Visual Basic 6 - ActiveX
    probabilmente questa soluzione ti va bene:

    Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    
    Static NClicks As Integer
    Static CoordsX As String
    Static CoordsY As String
    Dim Xmm As Double
    Dim XPoints As Variant
    Dim YPoints As Variant
    
    Picture1.DrawWidth = 3
    Picture1.PSet (X, Y)
    CoordsX = CoordsX & X & "|"
    CoordsY = CoordsY & Y & "|"
    NClicks = NClicks + 1
    If NClicks = 2 Then
        NClicks = 0
        CoordsX = Left(CoordsX, Len(CoordsX) - 1)
        CoordsY = Left(CoordsY, Len(CoordsY) - 1)
        XPoints = Split(CoordsX, "|")
        YPoints = Split(CoordsY, "|")
        Picture1.DrawWidth = 1
        Picture1.Line (XPoints(0), YPoints(0))-(XPoints(1), YPoints(1)), vbRed
        Xmm = Abs(Picture1.ScaleX(XPoints(1) - XPoints(0), vbTwips, vbMillimeters))
        MsgBox Xmm
        CoordsX = ""
        CoordsY = ""
        Picture1.Cls
    End If
    
    End Sub
    
    per provarla basta mettere una picturebox in un form.

    poi fare 2 click in due punti differenti.
    dopo il secondo click viene calcolata, in millimentri, la distanza delle X dei 2 punti.

    ovviamente la routine è così articolata, perchè volevo fare in modo che stesse tutto nell'evento mousedown, ma volendo è possibile disarticolarla un po' mettendo delle variabili pubbliche nel Form, ad esempio...

    per calcolare l'effettiva distanza dei punti, considerando quindi anche le coordinate Y, basta applicare il teorema di Pitagora

    TheTruster
    ℹ️ Leggi di pi su TheTruster ...

  6. #6
    L'avatar di Psycho
    Psycho non  in linea Scolaretto
    Grazie a entrambi per l'interesse ho provato tutti e due gli esempi e vanno bene.

    in rete ho trovato questo codice

    Private Type POINTAPI
    X As Long
    Y As Long
    End Type
    Private Declare Function GetCursorPos Lib _
    "user32" (lpPoint As POINTAPI) As Long

    Dim PosMouse As POINTAPI
    GetCursorPos PosMouse
    PosX= PosMouse.X
    PosY= PosMouse.Y

    In questo modo sò sempre dove stà il mouse ma c'è un piccolo problema perchè non mi dà l'esatta posizione del mouse nella picturebox ma ha come riferimento l'intero schermo....

    Come posso risolvere...

    GRAZIE mille
    ℹ️ Leggi di pi su Psycho ...

  7. #7
    L'avatar di chico_
    chico_ non  in linea Topo di biblioteca Ultimo blog: Attacco a Oscommerce
    Scusami se arretro di un passo nella discussione, ma se il tuo scopo è quello di misurare un oggetto fotografato e aspettarti che la risposta sia la misura esatta dello stesso, il tutto e' perlomeno improbabile.......sempre che il tuo scopo sia quello, beninteso.

    CIauz

    Chico
    ℹ️ Leggi di pi su chico_ ...

  8. #8
    L'avatar di TheTruster
    TheTruster non  in linea Moderatore Globale Ultimo blog: Mouse Wheel in Visual Basic 6 - ActiveX
    sono d'accordo con Chico,

    la realizzazione pratica della cosa in se non presenta grosse difficoltà... ma sull'attendibilità della "misurazione", avrei decisamente molti dubbi

    TheTruster
    ℹ️ Leggi di pi su TheTruster ...

  9. #9
    L'avatar di Psycho
    Psycho non  in linea Scolaretto
    Avete perfettamente ragione... Stò seguendo un esperimento per conto dell'università che frequento e devo fare delle foto a dei funghi posti dentro delle piastre Petri e vedere ogni due giorni quanti mm crescono. Le foto sono fatte da un microscopio ad alta precisione. Sul bordo inferiore di ogni foto c'è una scaletta in millimetri, quindi ogni foto la passo sul pc "calibro" il software cioe a tot pixel corrispondono tot millimetri ed ho una misura abbastanza precisa per quello che mi serve.

    Per quanto riguarda il fatto della posizione del mouse che ha come riferimanto lo schermo ho risolto così: (l'ho trovato in rete)

    Private Declare Function GetCursorPos Lib "user32" Alias "GetCursorPos" (lpPoint As POINTAPI) As Long

    Con la variabile del tipo POINTAPI:

    Type POINTAPI
    x As Long
    y As Long
    End Type

    La funzione GetCursorPos restituisce in una variabile di tipo definito dall’utente denominata POINTAPI le coordinate x,y relative all’angolo superiore a sinistra dello schermo.

    Esempio
    Sub PosizioneScreenMouse()
    Dim Posizione As POINTAPI
    Dim PuntoX As Integer
    Dim PuntoY As Integer
    GetCursorPos Posizione
    'per ricavare la posizione x e y
    PuntoX = Posizione.x'coordinata del punto x
    PuntoY = Posizione.y'coordinata del punto y
    End Sub

    GetCursorPos da la posizione del cursore , rispetto all’angolo superiore sinistro dello schermo. Se si desidera conoscere la posizione del mouse, relativamente al form in uso si deve convertire i valori con:

    Private Declare Function ScreenToClient Lib "user32" Alias "ScreenToClient" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long

    La funzione ScreenToClient converte le coordinate x,y, ricavate con la funzione GetCursorPos, nelle coordinate relative all’angolo superiore sinistro di un form specificato.

    Esempio
    Sub PosizioneWindowMouse()
    Dim Posizione As POINTAPI
    Dim PuntoX As Integer
    Dim PuntoY As Integer
    GetCursorPos Posizione'restituisce la posizione x,y relativamente allo schermo
    ScreenToClient Me.hWnd, Posizione 'converte la posizione x,y relativamente al form specificata (.hWnd)

    'per ricavare la posizione x e y
    PuntoX = Posizione.x'coordinata del punto x relativa al form corrente
    PuntoY = Posizione.y'coordinata del punto y relativa al form corrente
    End Sub

    le due funzioni, GetCursorPos e ScreenToClient, restituiscono la posizione del mouse con valori espressi in pixel. Per convertire i valori in Twip :

    PuntoX = Posizione.x * Screen.TwipsPerPixelX’
    PuntoY = Posizione.y * Screen.TwipsPerPixelY


    Ora ottengo alla fine tramite il teorema di pitagora la distanza tra il punto A e il punto B espressa in pixel... Come faccio a convertirla in millimetri???

    GRAZIE mille a tutti per la grande pasienza...
    ℹ️ Leggi di pi su Psycho ...

  10. #10
    L'avatar di TheTruster
    TheTruster non  in linea Moderatore Globale Ultimo blog: Mouse Wheel in Visual Basic 6 - ActiveX
    forse non hai notato i metodi ScaleX e ScaleY del Form, uno dei quali, è stato usato nel mio esempio...

    TheTruster
    ℹ️ Leggi di pi su TheTruster ...

+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo

Potrebbero interessarti anche ...

  1. pixel immagine bmp
    Da fabio7david nel forum C/C++
    Risposte: 3
    Ultimo Post: 05-06-2012, 19:35
  2. come si colora un pixel?
    Da xreme nel forum Visual Basic 6
    Risposte: 7
    Ultimo Post: 30-07-2006, 08:47
  3. img 13x13 pixel
    Da daniele-puma nel forum Pausa caff
    Risposte: 10
    Ultimo Post: 22-03-2006, 16:56
  4. Pixel art
    Da spider nel forum Altri linguaggi e strumenti
    Risposte: 1
    Ultimo Post: 04-02-2005, 01:56
  5. twip e pixel
    Da gene50 nel forum Visual Basic 6
    Risposte: 1
    Ultimo Post: 12-07-2004, 22:04