Skip to content

Commit

Permalink
Create GPU filter during initialization
Browse files Browse the repository at this point in the history
Create GPU filter during initialization
  • Loading branch information
ShengguangXiao committed May 23, 2019
1 parent 35098cf commit 13b50d0
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 19 deletions.
41 changes: 27 additions & 14 deletions VisionLibrary/CudaAlgorithm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
#include "opencv2/core.hpp"
#include "opencv2/core/cuda_stream_accessor.hpp"
#include "opencv2/cudaarithm.hpp"
#include "opencv2/cudafilters.hpp"
#include "opencv2/highgui.hpp"
#include "CudaFunc.h"
#include "TimeLog.h"
Expand All @@ -17,6 +16,9 @@ namespace Vision

/*static*/ DlpCalibResult CudaAlgorithm::m_dlpCalibData[NUM_OF_DLP];
/*static*/ Calc3DHeightVars CudaAlgorithm::m_arrCalc3DHeightVars[NUM_OF_DLP];
/*static*/ cv::Ptr<cv::cuda::Filter> CudaAlgorithm::m_ptrXDiffFilter;
/*static*/ cv::Ptr<cv::cuda::Filter> CudaAlgorithm::m_ptrYDiffFilter;
/*static*/ cv::Ptr<cv::cuda::Filter> CudaAlgorithm::m_ptrGaussianFilter;

static int divUp(int total, int grain)
{
Expand All @@ -32,6 +34,14 @@ static int divUp(int total, int grain)
cudaDeviceGetLimit(&size, cudaLimitMallocHeapSize);

cudaDeviceSetLimit(cudaLimitDevRuntimeSyncDepth, 16);

cv::Mat matKernelX = (cv::Mat_<float>(1, 2) << -1, 1);
m_ptrXDiffFilter = cv::cuda::createLinearFilter(CV_32FC1, CV_32FC1, matKernelX, cv::Point(-1, -1), cv::BORDER_CONSTANT);

cv::Mat matKernelY = (cv::Mat_<float>(2, 1) << -1, 1);
m_ptrYDiffFilter = cv::cuda::createLinearFilter(CV_32FC1, CV_32FC1, matKernelY, cv::Point(-1, -1), cv::BORDER_CONSTANT);

m_ptrGaussianFilter = cv::cuda::createGaussianFilter(CV_32FC1, CV_32FC1, cv::Size(5, 5), 5, 5, cv::BorderTypes::BORDER_REPLICATE);
return true;
}

Expand Down Expand Up @@ -191,14 +201,12 @@ static int divUp(int total, int grain)
if (nRecersiveTime > 1)
return diff(diff(matInput, nRecersiveTime - 1, nDimension), 1, nDimension);

cv::Mat matKernel;
cv::cuda::GpuMat matResult;
if (CalcUtils::DIFF_ON_X_DIR == nDimension)
matKernel = (cv::Mat_<float>(1, 2) << -1, 1);
m_ptrXDiffFilter->apply(matInput, matResult, stream);
else if (CalcUtils::DIFF_ON_Y_DIR == nDimension)
matKernel = (cv::Mat_<float>(2, 1) << -1, 1);
auto filter = cv::cuda::createLinearFilter(CV_32FC1, CV_32FC1, matKernel, cv::Point(-1, -1), cv::BORDER_CONSTANT);
cv::cuda::GpuMat matResult;
filter->apply(matInput, matResult, stream);
m_ptrYDiffFilter->apply(matInput, matResult, stream);

if (CalcUtils::DIFF_ON_X_DIR == nDimension)
return cv::cuda::GpuMat(matResult, cv::Rect(1, 0, matResult.cols - 1, matResult.rows));
else if (CalcUtils::DIFF_ON_Y_DIR == nDimension)
Expand All @@ -213,13 +221,18 @@ static int divUp(int total, int grain)
cv::cuda::Stream& stream /*= cv::cuda::Stream::Null()*/) {
assert(CalcUtils::DIFF_ON_X_DIR == nDimension || CalcUtils::DIFF_ON_Y_DIR == nDimension);

cv::Mat matKernel;
if (CalcUtils::DIFF_ON_X_DIR == nDimension)
matKernel = (cv::Mat_<float>(1, 2) << -1, 1);
m_ptrXDiffFilter->apply(matInput, matResult, stream);
else if (CalcUtils::DIFF_ON_Y_DIR == nDimension)
matKernel = (cv::Mat_<float>(2, 1) << -1, 1);
auto filter = cv::cuda::createLinearFilter(CV_32FC1, CV_32FC1, matKernel, cv::Point(-1, -1), cv::BORDER_CONSTANT);
filter->apply(matInput, matResult, stream);
m_ptrYDiffFilter->apply(matInput, matResult, stream);
//cv::Mat matKernel;
//if (CalcUtils::DIFF_ON_X_DIR == nDimension)
// matKernel = (cv::Mat_<float>(1, 2) << -1, 1);
//else if (CalcUtils::DIFF_ON_Y_DIR == nDimension)
// matKernel = (cv::Mat_<float>(2, 1) << -1, 1);
//auto filter = cv::cuda::createLinearFilter(CV_32FC1, CV_32FC1, matKernel, cv::Point(-1, -1), cv::BORDER_CONSTANT);
//filter->apply(matInput, matResult, stream);

if (CalcUtils::DIFF_ON_X_DIR == nDimension)
matResult = cv::cuda::GpuMat(matResult, cv::Rect(1, 0, matResult.cols - 1, matResult.rows));
else if (CalcUtils::DIFF_ON_Y_DIR == nDimension)
Expand Down Expand Up @@ -920,7 +933,7 @@ static int divUp(int total, int grain)
matHeightTwo.copyTo(matHeightTre, matMaskGpu3, stream);
matHeightOne.copyTo(matHeightTre, matMaskGpu4, stream);

matHeightFor = matHeightTre.clone(); // matBufferGpu2 is matHeightFor
matHeightTre.copyTo(matHeightFor); // Equal to cv::Mat matHeightFor = matHeightTre.clone();

cv::cuda::absdiff(matHeightOne, matHeightTwo, matAbsDiff, stream);
cv::cuda::compare(matAbsDiff, fDiffThreshold, matBigDiffMask, cv::CmpTypes::CMP_GT, stream);
Expand Down Expand Up @@ -1136,7 +1149,7 @@ static int divUp(int total, int grain)

cv::cuda::absdiff(matHeightOne, matHeightTwo, matAbsDiff, stream);
cv::cuda::compare(matAbsDiff, fDiffThreshold, matBigDiffMask, cv::CmpTypes::CMP_GT, stream);
matHeightFor.setTo(NAN, matBigDiffMask);
matHeightFor.setTo(NAN, matBigDiffMask, stream);

getNanMask(matHeightFor, matBigDiffMask, stream);
matBigDiffMask.convertTo(matBigDiffMaskFloat, CV_32FC1, stream);
Expand Down
4 changes: 4 additions & 0 deletions VisionLibrary/CudaAlgorithm.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#include "opencv2/core.hpp"
#include "VisionHeader.h"
#include "opencv2/core/cuda.hpp"
#include "opencv2/cudafilters.hpp"

namespace AOI
{
Expand Down Expand Up @@ -53,8 +54,11 @@ class CudaAlgorithm
~CudaAlgorithm() = delete;
static DlpCalibResult m_dlpCalibData[NUM_OF_DLP];
static Calc3DHeightVars m_arrCalc3DHeightVars[NUM_OF_DLP];
static cv::Ptr<cv::cuda::Filter> m_ptrXDiffFilter;
static cv::Ptr<cv::cuda::Filter> m_ptrYDiffFilter;

public:
static cv::Ptr<cv::cuda::Filter> m_ptrGaussianFilter;
static DlpCalibResult& getDlpCalibData(int nDlp) { return m_dlpCalibData[nDlp]; }
static Calc3DHeightVars& getCalc3DHeightVars(int nDLp) { return m_arrCalc3DHeightVars[nDLp]; }
static bool initCuda();
Expand Down
7 changes: 2 additions & 5 deletions VisionLibrary/Unwrap.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1003,11 +1003,8 @@ static inline cv::Mat calcOrder5BezierCoeff(const cv::Mat &matU) {

//TimeLog::GetInstance()->addTimeLog("After median filter.", stopWatch.Span());

if (pstCmd->bEnableGaussianFilter) {
auto ptrFilter = cv::cuda::createGaussianFilter(CV_32FC1, CV_32FC1, cv::Size(5, 5), 5, 5, cv::BorderTypes::BORDER_REPLICATE);
ptrFilter->apply(matAlphaGpu, matBufferGpu, stream);
//cv::GaussianBlur(pstRpy->matPhase, pstRpy->matPhase, cv::Size(5, 5), 5, 5, cv::BorderTypes::BORDER_REPLICATE);
}
if (pstCmd->bEnableGaussianFilter)
CudaAlgorithm::m_ptrGaussianFilter->apply(matAlphaGpu, matBufferGpu, stream);

if (!pstCmd->mat3DBezierK.empty()) {
std::vector<float> vecParamMinMaxXY{ 1.f, ToFloat(matAlphaGpu.cols), 1.f, ToFloat(matAlphaGpu.rows),
Expand Down

0 comments on commit 13b50d0

Please sign in to comment.