bool FindAndApplyChessPatternExtrinsics() { bool found = TrackingToolsHelper.FindChessboardCorners(_camTexGrayUndistortMat, _chessPatternSize, ref _chessCornersImageMat); if (found) { TrackingToolsHelper.DrawFoundPattern(_camTexGrayUndistortMat, _chessPatternSize, _chessCornersImageMat); _cameraExtrinsicsCalibrator.UpdateExtrinsics(_chessCornersWorldMat, _chessCornersImageMat, _cameraIntrinsics, _cameraTexture.width, _cameraTexture.height); const bool transformBoard = true; _cameraExtrinsicsCalibrator.extrinsics.ApplyToTransform(_calibrationBoardTransform, _mainCamera.transform, transformBoard); } _chessPatternTransform.gameObject.SetActive(found); return(found); }
void UpdateTesting(bool foundBoard) { _arImage.enabled = foundBoard; if (!foundBoard) { return; } bool success = _extrinsicsCalibrator.UpdateExtrinsics(_chessCornersWorldMat, _chessCornersImageMat, _intrinsicsCalibrator.intrinsics, _intrinsicsCalibrator.textureWidth, _intrinsicsCalibrator.textureHeight); if (success) { _extrinsicsCalibrator.extrinsics.ApplyToTransform(_mainCamera.transform); } _arImage.enabled = success; }
void Update() { if (!_cameraTexture || !_dirtyCameraTexture) { return; } if (!AdaptResources()) { return; } // Update mat texture (If the textyre looks right in Unity, it needs to be flipped for OpenCV.) TrackingToolsHelper.TextureToMat(_cameraTexture, !_flipCameraTexture, ref _camTexMat, ref _tempTransferColors, ref _tempTransferTexture); // Convert to grayscale if more than one channel, else copy (and convert bit rate if necessary). TrackingToolsHelper.ColorMatToLumanceMat(_camTexMat, _camTexGrayMat); // Undistort (TODO: move undistortion to GPU as last step and work on distorted image instead). //Calib3d.undistort( _camTexGrayMat, _camTexGrayUndistortMat, _sensorMat, _distortionCoeffsMat ); Imgproc.remap(_camTexGrayMat, _camTexGrayUndistortMat, _undistortMap1, _undistortMap2, Imgproc.INTER_LINEAR); // Find chessboard. bool foundBoard = TrackingToolsHelper.FindChessboardCorners(_camTexGrayUndistortMat, _chessPatternSize, ref _chessCornersImageMat, _fastAndImprecise); if (foundBoard) { // Draw chessboard. TrackingToolsHelper.DrawFoundPattern(_camTexGrayUndistortMat, _chessPatternSize, _chessCornersImageMat); // Update and apply extrinsics. bool foundExtrinsics = _extrinsicsCalibrator.UpdateExtrinsics(_chessCornersWorldMat, _chessCornersImageMat, _intrinsics, _cameraTexture.width, _cameraTexture.height); if (foundExtrinsics) { if (_tranformPattern) { _extrinsicsCalibrator.extrinsics.ApplyToTransform(_chessPatternTransform, _applyRelative ? _mainCamera.transform : null, _tranformPattern); if (!_applyRelative) { _mainCamera.transform.SetPositionAndRotation(Vector3.zero, Quaternion.identity); } } else { _extrinsicsCalibrator.extrinsics.ApplyToTransform(_mainCamera.transform, _applyRelative ? _chessPatternTransform : null); if (!_applyRelative) { _chessPatternTransform.SetPositionAndRotation(Vector3.zero, Quaternion.identity); } } } _arImage.gameObject.SetActive(foundExtrinsics); } else { _arImage.gameObject.SetActive(false); } // UI. Utils.fastMatToTexture2D(_camTexGrayUndistortMat, _processedCameraTexture); // Flips vertically by default if (_precisionDotsContainerObject.activeSelf != _testPrecisionDotsEnabled) { _precisionDotsContainerObject.SetActive(_testPrecisionDotsEnabled); } _dirtyCameraTexture = false; }