Reputation: 1
Currently im porting my application from IPP to use NPP. I encounter issue with nppiWarpPerspectiveBack_32f_C1R returns warning 2 (NPP_WRONG_INTERSECTION_QUAD_WARNING). But i know for the same coefficient IPP call works fine.
In program attached there are two coeff with little difference but one work and other fails. Any help on this will be great.
// WarpIssue.cpp : Defines the entry point for the console application.
//
#include <stdafx.h>
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include "nppi.h"
cudaError_t warp(Npp32f* srcImg, NppiSize srcSize, int srcWidthStep, Npp32f* dstImg, NppiSize dstSize, int dstWidthStep, double coeff[][3]);
int _tmain(int argc, _TCHAR* argv[])
{
const int arraySize = 5;
const int a[arraySize] = { 1, 2, 3, 4, 5 };
const int b[arraySize] = { 10, 20, 30, 40, 50 };
int c[arraySize] = { 0 };
// Choose which GPU to run on, change this on a multi-GPU system.
cudaError_t cudaStatus = cudaSetDevice(0);
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaSetDevice failed! Do you have a CUDA-capable GPU installed?");
return 1;
}
//Allocate src image data
int srcWidth=1600;
int srcHeight=1200;
int srcWidthStep = 0;
Npp32f* srcImgData = nppiMalloc_32f_C1(srcWidth, srcHeight, &srcWidthStep);
NppiSize srcSize = {srcWidth, srcHeight};
nppiSet_32f_C1R(255.0f, srcImgData, srcWidthStep, srcSize);
//Allocate dst image data
int dstWidth=720;
int dstHeight=480;
int dstWidthStep = 0;
Npp32f* dstImgData = nppiMalloc_32f_C1(dstWidth, dstHeight, &dstWidthStep);
NppiSize dstSize = {dstWidth, dstHeight};
nppiSet_32f_C1R(0.0f, dstImgData, dstWidthStep, dstSize);
//Not Working
double coeff[3][3] = { 0.990986, -0.008086, 733.528174,
0.002669, 1.000126, 352.375707,
-0.000010, 0.000000, 1.001975, };
//Working
/*double coeff[3][3] = { 0.991379, -0.007775, 722.431470,
0.002568, 1.000126, 352.410450,
-0.000009, 0.000000, 1.001949 };*/
//Warp
cudaStatus = warp(srcImgData, srcSize, srcWidthStep, dstImgData, dstSize, dstWidthStep, coeff);
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "Back warp failed!");
return 1;
}
//Copy it to cpu
int step = 0;
Npp8u* byteImg = nppiMalloc_8u_C1(dstWidth, dstHeight, &step);
NppiSize sz = {dstWidth, dstHeight };
nppiConvert_32f8u_C1R(dstImgData, dstWidthStep, byteImg, step, sz, NPP_RND_NEAR);
char* cpuImg = (char*)malloc(dstWidth*dstHeight);
cudaMemcpy2D(cpuImg, dstWidth, byteImg, step, dstWidth, dstHeight, cudaMemcpyDeviceToHost);
FILE* imgFile = fopen("output.raw", "w");
fwrite(cpuImg, dstWidth*dstHeight, 1, imgFile);
fclose(imgFile);
//Cleanup
nppiFree(srcImgData);
nppiFree(dstImgData);
nppiFree(byteImg);
cudaStatus = cudaThreadExit();
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaThreadExit failed!");
return 1;
}
return 0;
}
cudaError_t warp(Npp32f* srcImg, NppiSize srcSize, int srcWidthStep, Npp32f* dstImg, NppiSize dstSize, int dstWidthStep, double coeff[][3])
{
int *dev_a = 0;
int *dev_b = 0;
int *dev_c = 0;
cudaError_t cudaStatus;
NppiRect srcRoi = {0, 0, srcSize.width, srcSize.height};
NppiRect dstRoi = {0, 0, dstSize.width, dstSize.height};
cudaStatus= (cudaError_t)nppiWarpPerspectiveBack_32f_C1R(srcImg, srcSize, srcWidthStep, srcRoi,
dstImg, dstWidthStep, dstRoi, coeff, NPPI_INTER_LINEAR);
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "nppiWarpPerspectiveBack_32f_C1R returned error code %d !\n", cudaStatus);
goto Error;
}
cudaStatus = cudaDeviceSynchronize();
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaDeviceSynchronize returned error code %d after launching addKernel!\n", cudaStatus);
goto Error;
}
Error:
return cudaStatus;
}
Upvotes: 0
Views: 246
Reputation: 11
NPP issues a warning here because when checking parameters before performing the warp the starting X coordinate of your post transformed srcROI is 732 but your dstROI starts at X coordinate 0 and has a width of 720. Therefore, there will be NO post transformed source pixels within the destination ROI.
Upvotes: 1