#Region Project Attributes
#MainFormWidth: 800
#MainFormHeight: 550
#End Region
Sub Process_Globals
Private fx As JFX
Private MainForm As Form
Private xui As XUI
Private OpenCVlibPath As String
Private SP As ShapePoints
Private cvs As B4XCanvas
Private Pane As Pane
Private MContours As Map
Private SpContour As Spinner
Private Spthreshold As Spinner
Private TfBrowse As TextField
Private FileChosen As String
Private Iv As ImageView
End Sub
Sub AppStart (Form1 As Form, Args() As String)
MainForm = Form1
MainForm.SetFormStyle("UNIFIED")
MainForm.RootPane.LoadLayout("Main") 'Load the layout file.
MainForm.Title = "OpenCV Shape Point"
MainForm.Show
cvs.Initialize(Pane)
MContours.Initialize
OpenCVlibPath = File.DirApp&"\lib"
If Not(File.IsDirectory(File.DirApp,"tmp")) Then
File.MakeDir(File.DirApp,"tmp")
End If
End Sub
Sub BtnAdd_Click
Dim FC As FileChooser
FC.Initialize
FC.SetExtensionFilter("Image File", Array As String("*.png", "*.jpg", "*.bmp", "*.gif"))
FileChosen = FC.ShowOpen(MainForm)
FC.Title = "Select an image file"
If FileChosen.IndexOf(".") > -1 Then
TfBrowse.Text = FileChosen
Dim bmp As B4XBitmap = xui.LoadBitmap(FC.InitialDirectory, File.GetName(FileChosen))
Iv.SetImage(bmp)
TakeSnap(Iv)
End If
End Sub
Private Sub TakeSnap(View As B4XView)
Dim snap As Image
snap = View.Snapshot
Dim Out As OutputStream = File.OpenOutput(File.DirApp, "\tmp\last.png",False)
snap.WriteToStream(Out)
Out.Close
Scan
End Sub
Private Sub Scan
Dim Snap As String = File.DirApp&"\tmp\last.png"
Dim th As Int = Spthreshold.Value
SP.Initialize(Snap,OpenCVlibPath,th)
SpContour.SetNumericItems(0,SP.NumShape-1,1,SP.NumShape-1)
End Sub
Sub DrawPolygon (cvs1 As B4XCanvas, SPnts As List, Color As Int, Filled As Boolean, StrokeWidth As Double)
If SPnts.Size < 1 Then Return
Dim jcvs As JavaObject = cvs1
jcvs = jcvs.GetFieldJO("cvs").RunMethodJO("getObject", Null).RunMethod("getGraphicsContext2D", Null)
jcvs.RunMethod("save", Null)
Dim xSPnts(SPnts.Size), ySPnts(SPnts.Size) As Double
For i = 0 To SPnts.Size - 1
Dim SPnt() As Int = SPnts.Get(i)
xSPnts(i) = SPnt(0)
ySPnts(i) = SPnt(1)
Next
Dim paint As Object = fx.Colors.From32Bit(Color)
If Filled Then
jcvs.RunMethod("setFill", Array(paint))
jcvs.RunMethod("fillPolygon", Array(xSPnts, ySPnts, SPnts.Size))
Else
jcvs.RunMethod("setStroke", Array(paint))
jcvs.RunMethod("setLineWidth", Array(StrokeWidth))
jcvs.RunMethod("strokePolygon", Array(xSPnts, ySPnts, SPnts.Size))
End If
jcvs.RunMethod("restore", Null)
End Sub
Sub BtnDraw_Click
Dim n As Int = SpContour.Value
If n > SP.NumShape Then Return
Dim SPnts As List = SP.Find(n)
DrawPolygon(cvs,SPnts,xui.Color_Red, False, 1dip)
cvs.Invalidate
End Sub
Sub BtnClean_Click
Dim n As Int = SpContour.Value
If n > SP.NumShape Then Return
Dim SPnts As List = SP.Find(n)
DrawPolygon(cvs,SPnts,xui.Color_Black, False, 2dip)
cvs.Invalidate
End Sub
Sub Spthreshold_ValueChanged (Value As Object)
SP.Update(Value)
SpContour.SetNumericItems(0,SP.NumShape-1,1,SP.NumShape-1)
End Sub
Sub BtnAuto_Click
cvs.ClearRect(cvs.TargetRect)
For n = 0 To SP.NumShape-1
Dim SPnts As List = SP.Find(n)
DrawPolygon(cvs,SPnts,xui.Color_Green, False, 1dip)
cvs.Invalidate
Next
End Sub
Sub BtnClear_Action
cvs.ClearRect(cvs.TargetRect)
End Sub