0

次の OpenVx Sobel 即時コードを Graph ベースの に変換しました。しかし、行われた結果は一致します。

即時コードは正常に機能し、適切な結果が得られます。一方、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 に答える