minor refactoring in gpu module
This commit is contained in:
parent
21b081deff
commit
eaf35a8421
@ -1255,7 +1255,6 @@ namespace
|
|||||||
|
|
||||||
void cv::gpu::convolve(const GpuMat& image, const GpuMat& templ, GpuMat& result, bool ccorr)
|
void cv::gpu::convolve(const GpuMat& image, const GpuMat& templ, GpuMat& result, bool ccorr)
|
||||||
{
|
{
|
||||||
// We must be sure we use correct OpenCV analogues for CUFFT types
|
|
||||||
StaticAssert<sizeof(float) == sizeof(cufftReal)>::check();
|
StaticAssert<sizeof(float) == sizeof(cufftReal)>::check();
|
||||||
StaticAssert<sizeof(float) * 2 == sizeof(cufftComplex)>::check();
|
StaticAssert<sizeof(float) * 2 == sizeof(cufftComplex)>::check();
|
||||||
|
|
||||||
@ -1278,9 +1277,9 @@ void cv::gpu::convolve(const GpuMat& image, const GpuMat& templ, GpuMat& result,
|
|||||||
GpuMat result_data = createContinuous(dft_size, CV_32F);
|
GpuMat result_data = createContinuous(dft_size, CV_32F);
|
||||||
|
|
||||||
int spect_len = dft_size.height * (dft_size.width / 2 + 1);
|
int spect_len = dft_size.height * (dft_size.width / 2 + 1);
|
||||||
GpuMat image_spect = createContinuous(1, spect_len, CV_32FC2);
|
GpuMat image_spect(1, spect_len, CV_32FC2);
|
||||||
GpuMat templ_spect = createContinuous(1, spect_len, CV_32FC2);
|
GpuMat templ_spect(1, spect_len, CV_32FC2);
|
||||||
GpuMat result_spect = createContinuous(1, spect_len, CV_32FC2);
|
GpuMat result_spect(1, spect_len, CV_32FC2);
|
||||||
|
|
||||||
cufftHandle planR2C, planC2R;
|
cufftHandle planR2C, planC2R;
|
||||||
cufftSafeCall(cufftPlan2d(&planC2R, dft_size.height, dft_size.width, CUFFT_C2R));
|
cufftSafeCall(cufftPlan2d(&planC2R, dft_size.height, dft_size.width, CUFFT_C2R));
|
||||||
@ -1301,34 +1300,23 @@ void cv::gpu::convolve(const GpuMat& image, const GpuMat& templ, GpuMat& result,
|
|||||||
{
|
{
|
||||||
for (int x = 0; x < result.cols; x += block_size.width)
|
for (int x = 0; x < result.cols; x += block_size.width)
|
||||||
{
|
{
|
||||||
Size image_roi_size;
|
Size image_roi_size(std::min(x + dft_size.width, image.cols) - x,
|
||||||
image_roi_size.width = std::min(x + dft_size.width, image.cols) - x;
|
std::min(y + dft_size.height, image.rows) - y);
|
||||||
image_roi_size.height = std::min(y + dft_size.height, image.rows) - y;
|
|
||||||
|
|
||||||
// Locate ROI in the source matrix
|
|
||||||
GpuMat image_roi(image_roi_size, CV_32F, (void*)(image.ptr<float>(y) + x), image.step);
|
GpuMat image_roi(image_roi_size, CV_32F, (void*)(image.ptr<float>(y) + x), image.step);
|
||||||
|
|
||||||
// Make source image block is continuous
|
|
||||||
copyMakeBorder(image_roi, image_block, 0, image_block.rows - image_roi.rows, 0,
|
copyMakeBorder(image_roi, image_block, 0, image_block.rows - image_roi.rows, 0,
|
||||||
image_block.cols - image_roi.cols, 0);
|
image_block.cols - image_roi.cols, 0);
|
||||||
|
|
||||||
cufftSafeCall(cufftExecR2C(planR2C, image_block.ptr<cufftReal>(),
|
cufftSafeCall(cufftExecR2C(planR2C, image_block.ptr<cufftReal>(),
|
||||||
image_spect.ptr<cufftComplex>()));
|
image_spect.ptr<cufftComplex>()));
|
||||||
|
|
||||||
mulAndScaleSpectrums(image_spect, templ_spect, result_spect, 0,
|
mulAndScaleSpectrums(image_spect, templ_spect, result_spect, 0,
|
||||||
1.f / dft_size.area(), ccorr);
|
1.f / dft_size.area(), ccorr);
|
||||||
|
|
||||||
cufftSafeCall(cufftExecC2R(planC2R, result_spect.ptr<cufftComplex>(),
|
cufftSafeCall(cufftExecC2R(planC2R, result_spect.ptr<cufftComplex>(),
|
||||||
result_data.ptr<cufftReal>()));
|
result_data.ptr<cufftReal>()));
|
||||||
|
|
||||||
Size result_roi_size;
|
Size result_roi_size(std::min(x + block_size.width, result.cols) - x,
|
||||||
result_roi_size.width = std::min(x + block_size.width, result.cols) - x;
|
std::min(y + block_size.height, result.rows) - y);
|
||||||
result_roi_size.height = std::min(y + block_size.height, result.rows) - y;
|
|
||||||
|
|
||||||
GpuMat result_roi(result_roi_size, result.type(), (void*)(result.ptr<float>(y) + x), result.step);
|
GpuMat result_roi(result_roi_size, result.type(), (void*)(result.ptr<float>(y) + x), result.step);
|
||||||
GpuMat result_block(result_roi_size, result_data.type(), result_data.ptr(), result_data.step);
|
GpuMat result_block(result_roi_size, result_data.type(), result_data.ptr(), result_data.step);
|
||||||
|
|
||||||
// Copy block into appropriate part of the result matrix
|
|
||||||
result_block.copyTo(result_roi);
|
result_block.copyTo(result_roi);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user