0

我已将以下 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
4

2 回答 2

1

首先,您应该检查 vxVerifyGraph 的结果。像这样:

vx_status stat = vxVerifyGraph(graph);
if (stat != VX_SUCCESS)
    printf("Graph failed (%d)\n", stat);
else
    vxProcessGraph(graph);

对于您的示例,它为 vxConvertDepthNode 函数返回“-4”。

vx_types.h 说:

VX_ERROR_NOT_SUFFICIENT = -4, /*!< \brief 表示由于所需参数数量不足,无法自动创建给定图,因此验证失败。通常这表示所需的原子参数。\请参见 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, /*!< \brief 表示提供的图有无效的连接(循环)。*/

这就是@jet47 所说的。您应该使用另一个图像进行输出:

if(vxConvertDepthNode(graph,intermediate3,imageOut,VX_CONVERT_POLICY_WRAP,sshift ) == 0)  {
   printf("ERROR failed to do color convert");
}

现在它工作正常。

于 2016-06-07T14:26:51.063 回答
0

请检查返回码vxVerifyGraph。您的图形包含一个image被禁止的循环(对象),因此它应该在验证阶段失败。要解决此问题,请使用另一个图像进行vxConvertDepthNode输出。

于 2016-04-11T16:59:30.657 回答