Непосредственный код 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 выход.

Другие вопросы по тегам