private void updateViewport() { if (xyViewportRB.Checked) { this.scalingFactorTB.Text=Convert.ToString(localSettingsInstance.viewportXYScalingFactor); this.horizontalResTB.Text=Convert.ToString(localSettingsInstance.viewportXYHorizontalRes); this.verticalResTB.Text=Convert.ToString(localSettingsInstance.viewportXYVerticalRes); if (localSettingsInstance.viewportXYScalingType==BaseTypes.scalingType.Native) this.keepNativeSizeRB.Checked=true; if (localSettingsInstance.viewportXYScalingType==BaseTypes.scalingType.ScaleBy) this.scaleByRB.Checked=true; if (localSettingsInstance.viewportXYScalingType==BaseTypes.scalingType.Custom) this.customResolutionRB.Checked=true; last_viewport = BaseTypes.viewport.XY; } else if (xzViewportRB.Checked) { this.scalingFactorTB.Text=Convert.ToString(localSettingsInstance.viewportXZScalingFactor); this.horizontalResTB.Text=Convert.ToString(localSettingsInstance.viewportXZHorizontalRes); this.verticalResTB.Text=Convert.ToString(localSettingsInstance.viewportXZVerticalRes); if (localSettingsInstance.viewportXZScalingType==BaseTypes.scalingType.Native) this.keepNativeSizeRB.Checked=true; if (localSettingsInstance.viewportXZScalingType==BaseTypes.scalingType.ScaleBy) this.scaleByRB.Checked=true; if (localSettingsInstance.viewportXZScalingType==BaseTypes.scalingType.Custom) this.customResolutionRB.Checked=true; last_viewport = BaseTypes.viewport.XZ; } else { this.scalingFactorTB.Text=Convert.ToString(localSettingsInstance.viewportYZScalingFactor); this.horizontalResTB.Text=Convert.ToString(localSettingsInstance.viewportYZHorizontalRes); this.verticalResTB.Text=Convert.ToString(localSettingsInstance.viewportYZVerticalRes); if (localSettingsInstance.viewportYZScalingType==BaseTypes.scalingType.Native) this.keepNativeSizeRB.Checked=true; if (localSettingsInstance.viewportYZScalingType==BaseTypes.scalingType.ScaleBy) this.scaleByRB.Checked=true; if (localSettingsInstance.viewportYZScalingType==BaseTypes.scalingType.Custom) this.customResolutionRB.Checked=true; last_viewport = BaseTypes.viewport.YZ; } }
//updates point coordinates for given frames, and with given acceptance threshold and presumed position offset public void trackPoint(Bitmap xyFrame, Bitmap xzFrame, Bitmap yzFrame, int acceptanceThreshold, int lastPositionOffset) { vprtNotTracked=BaseTypes.viewport.None; prevXYCoordX=xyCoordX; prevXYCoordY=xyCoordY; prevXZCoordX=xzCoordX; prevXZCoordZ=xzCoordZ; prevYZCoordY=yzCoordY; prevYZCoordZ=yzCoordZ; Rectangle xyArea, xzArea, yzArea; xyArea = new Rectangle(xyCoordX - lastPositionOffset, xyCoordY-lastPositionOffset, xyCoordX+(2*xyRadius)+lastPositionOffset, xyCoordY+(2*xyRadius)+lastPositionOffset); xzArea = new Rectangle(xzCoordX - lastPositionOffset, xzCoordZ-lastPositionOffset, xzCoordX+(2*xzRadius)+lastPositionOffset, xzCoordZ+(2*xzRadius)+lastPositionOffset); yzArea = new Rectangle(yzCoordY - lastPositionOffset, yzCoordZ-lastPositionOffset, yzCoordY+(2*yzRadius)+lastPositionOffset, yzCoordZ+(2*yzRadius)+lastPositionOffset); locatePointThread lptXY = new locatePointThread(BaseTypes.viewport.XY, xyArea,xyFrame,acceptanceThreshold,xyRadius,xyAnn,new locatePointThreadCallback(locatePointThreadCallbackResult)); locatePointThread lptXZ = new locatePointThread(BaseTypes.viewport.XZ, xzArea,xzFrame,acceptanceThreshold,xzRadius,xzAnn,new locatePointThreadCallback(locatePointThreadCallbackResult)); locatePointThread lptYZ = new locatePointThread(BaseTypes.viewport.YZ, yzArea,yzFrame,acceptanceThreshold,yzRadius,yzAnn,new locatePointThreadCallback(locatePointThreadCallbackResult)); Thread xyTrackingThread = new Thread(new ThreadStart(lptXY.ThreadProc)); Thread xzTrackingThread = new Thread(new ThreadStart(lptXZ.ThreadProc)); Thread yzTrackingThread = new Thread(new ThreadStart(lptYZ.ThreadProc)); xyTrackingThread.Start(); xzTrackingThread.Start(); yzTrackingThread.Start(); calculateWorldCoords(); }
// The constructor obtains the state information. public locatePointThread( BaseTypes.viewport Vprt,Rectangle ScanArea,Bitmap Bmp,int AcceptanceThreshold,int radius, NeuralNetwork aan, locatePointThreadCallback callbackDelegate) { this.vprt = Vprt; this.scanArea = ScanArea; this.bmp = Bmp; this.acceptanceThreshold = AcceptanceThreshold; this.Radius=radius; this.Ann=aan; callback = callbackDelegate; }
//callback procedure used to retrieve results from tracking thread public void locatePointThreadCallbackResult(int xA, int yA, BaseTypes.viewport vPrt, bool tracked) { if (!tracked) vprtNotTracked=vPrt; switch (vPrt) { case BaseTypes.viewport.XY: { this.xyCoordX=xA; this.xyCoordY=yA; break; } case BaseTypes.viewport.XZ: { this.xzCoordX=xA; this.xzCoordZ=yA; break; } case BaseTypes.viewport.YZ: { this.yzCoordY=xA; this.yzCoordZ=yA; break; } } leftToProcess--; if (leftToProcess==0) { if (vprtNotTracked!=BaseTypes.viewport.None) { //locating missing point, using data from other viewports switch (vprtNotTracked) { case BaseTypes.viewport.XY: { this.xyCoordX= (int)((trackingPoint.DistanceQuotientXY*(this.xzCoordX - prevXZCoordX))/trackingPoint.DistanceQuotientXZ); this.xyCoordY= (int)((trackingPoint.DistanceQuotientXY*(this.yzCoordY - prevYZCoordY))/trackingPoint.DistanceQuotientYZ); break; } case BaseTypes.viewport.XZ: { this.xzCoordX= (int)((trackingPoint.DistanceQuotientXZ*(this.xyCoordX - prevXYCoordX))/trackingPoint.DistanceQuotientXY); this.xzCoordZ= (int)((trackingPoint.DistanceQuotientXZ*(this.yzCoordZ - prevYZCoordZ))/trackingPoint.DistanceQuotientYZ); break; } case BaseTypes.viewport.YZ: { this.yzCoordY= (int)((trackingPoint.DistanceQuotientYZ*(this.xyCoordY - prevXYCoordY))/trackingPoint.DistanceQuotientXY); this.yzCoordZ= (int)((trackingPoint.DistanceQuotientYZ*(this.xzCoordZ - prevXZCoordZ))/trackingPoint.DistanceQuotientXZ); break; } } } OnFrameProcessed(); } }