Непосредственный код OpenVx и графики не дают схожих результатов
Я преобразовал следующий непосредственный код OpenVx Sobel в Graph. Но результаты сделали матч.
Немедленный код работает нормально, он дает правильный результат. Принимая во внимание, что код графика занимает "больше времени", чем непосредственный код для одного изображения, и также дает неправильные результаты.
Так правильно ли мое обращение?
Немедленный код:
/* Intermediate images. */
vx_image dx = vxCreateImage(context, width, height, VX_DF_IMAGE_S16);
vx_image dy = vxCreateImage(context, width, height, VX_DF_IMAGE_S16);
vx_image mag = vxCreateImage(context, width, height, VX_DF_IMAGE_S16);
/* Perform Sobel convolution. */
if (vxuSobel3x3(context,image,dx, dy)!=VX_SUCCESS)
{
printf("ERROR: failed to do sobel!\n");
}
/* Calculate magnitude from gradients. */
if (vxuMagnitude(context,dx,dy,mag)!=VX_SUCCESS)
{
printf("ERROR: failed to do magnitude!\n");
}
//Convert result back to U8 image.
if (vxuConvertDepth(context,mag,image,VX_CONVERT_POLICY_WRAP,0)!=VX_SUCCESS)
{
printf("ERROR: failed to do color convert!\n");
}
Основанный на графике код вышеуказанного непосредственного кода
vx_graph graph = vxCreateGraph( context );
vx_image intermediate1 = vxCreateVirtualImage( graph, width, height, VX_DF_IMAGE_S16 );
vx_image intermediate2 = vxCreateVirtualImage( graph, width, height, VX_DF_IMAGE_S16 );
vx_image intermediate3 = vxCreateVirtualImage( graph, width, height, VX_DF_IMAGE_S16 );
if(vxSobel3x3Node(graph,image,intermediate1,intermediate2) == 0)
{
printf("FAILED TO Create 1 graph node");
}
if(vxMagnitudeNode(graph,intermediate1,intermediate2,intermediate3) == 0)
{
printf("ERROR: failed to do magnitude!\n");
}
if(vxConvertDepthNode(graph,intermediate3,image,VX_CONVERT_POLICY_WRAP,0) == 0)
{
printf("ERROR failed to do color convert");
}
vxVerifyGraph( graph );
vxProcessGraph( graph ); // run in a loop
2 ответа
Во-первых, вы должны проверить результат vxVerifyGraph. Как это:
vx_status stat = vxVerifyGraph(graph);
if (stat != VX_SUCCESS)
printf("Graph failed (%d)\n", stat);
else
vxProcessGraph(graph);
Для вашего примера он возвращает "-4" для функции vxConvertDepthNode.
vx_types.h говорит:
VX_ERROR_NOT_SUFFICIENT = -4, / *!<\Rief Указывает, что данный график не прошел проверку из-за недостаточного количества обязательных параметров, которые не могут быть созданы автоматически. Обычно это указывает на требуемые атомные параметры. \ см. vxVerifyGraph. * /
Правильное использование (я не помню, где мы его взяли):
vx_int32 shift = 0;
vx_scalar sshift = vxCreateScalar(context, VX_TYPE_INT32, &shift);
if(vxConvertDepthNode(graph,intermediate3,image,VX_CONVERT_POLICY_WRAP,sshift) == 0) {
printf("ERROR failed to do color convert");
}
Теперь vxVerifyGraph возвращает "-18".
VX_ERROR_INVALID_GRAPH = -18, / *!<\Rief Указывает, что предоставленный граф имеет недопустимые соединения (циклы). * /
Вот что говорит @jet47. Вы должны использовать другое изображение для вывода:
if(vxConvertDepthNode(graph,intermediate3,imageOut,VX_CONVERT_POLICY_WRAP,sshift ) == 0) {
printf("ERROR failed to do color convert");
}
Теперь все отлично работает.
Пожалуйста, проверьте код возврата vxVerifyGraph
, Ваш график содержит цикл (image
объект), что запрещено, поэтому он должен провалиться на этапе проверки. Чтобы исправить это, используйте другое изображение для vxConvertDepthNode
выход.