将新的 cv::mat 输入vx_graph
Feeding a new cv::Mat into a vx_graph
给定上一个问题中的示例代码(为简洁起见,删除了错误检查):
vx_image inputImage = vxCreateImage( graph, width, height, VX_DF_IMAGE_S16 );
vx_image outputImage = vxCreateImage( graph, width, height, VX_DF_IMAGE_S16 );
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 );
vxSobel3x3Node(graph,inputImage,intermediate1,intermediate2);
vxMagnitudeNode(graph,intermediate1,intermediate2,intermediate3);
vxConvertDepthNode(graph,intermediate3,outputImage,VX_CONVERT_POLICY_WRAP,0);
vxVerifyGraph( graph );
vxProcessGraph( graph );
以及经典的OpenCV阅读视频循环:
cv::VideoCapture cap;
cap.open("/Testing/test.avi");
for(;;)
{
cv::Mat frame;
cap >> frame;
if( frame.empty() ) break;
// TODO: what goes here?
vxProcessGraph( graph );
}
如何将frame
放入inputImage
以便正确呼叫vxProcessGraph()
?我知道那件事:
vx_image image = nvx_cv::createVXImageFromCVMat(frame);
是获得vx_image
的帮手,但我似乎找不到下一步该怎么做的例子。我读过的一些NVidia文档建议:
vxAccessImagePatch(...);
// copy pixel-by-pixel??
vxCommitImagePatch(...);
但是,这似乎有点太像蛮力了,那么是否有更好的方法(也许是vxSetParameter
,但文档非常不清楚)来做到这一点?
可以创建一个仅引用存储在cv::Mat
中的数据的vx_image
。 使用vx_image
访问数据的东西最终会实际访问存储在Mat
中的数据。 此方法仅使用记录的 OpenCV 和 OpenVX 函数。 从此英特尔文档中:
vx_image get_vx_image_from_Mat(vx_context graph, cv::Mat &mat) {
vx_imagepatch_addressing_t frame_format {};
frame_format.dim_x = mat.cols;
frame_format.dim_y = mat.rows;
return vxCreateImageFromHandle(graph,
VX_DF_IMAGE_S16,
&format,
&((void*)mat.data),
VX_IMPORT_TYPE_HOST);
}
据推测,cv:Mat
至少需要与以这种方式创建的任何vx_image
一样长的时间。
我设法制定了解决方案,因为让我对示例感到困惑的是使用了官方 API 中没有的辅助函数。
vx_status vxAddParameterToGraphByIndex(vx_graph g, vx_node n, vx_uint32 index)
{
vx_parameter p = vxGetParameterByIndex(n, index);
vx_status status = vxAddParameterToGraph(g, p);
vxReleaseParameter(&p);
return status;
}
现在,我上面的示例代码需要快速修改:
vx_node sobel = vxSobel3x3Node(graph,inputImage,intermediate1,intermediate2);
然后是魔术线:
vxAddParameterToGraphByIndex(graph, sobel, 0);
此处的0
表示sobel
节点的第 0 个参数,不包括graph
本身。
接下来,我的循环变成:
if( frame.empty() ) break;
vx_image image = nvx_cv::createVXImageFromCVMat(frame);
vxSetGraphParameterByIndex(graph, 0, (vx_reference) image);
vxProcessGraph( graph );
vxReleaseImage(&image);
在这里,0 表示我们添加到图中的第 0 个参数。如果我可以访问上面的vx_parameter p
,那么稍微不那么不友好:
vxSetParameterByIndex(p, (vx_reference) image);
这可能会单独工作,但我不知道是否有额外的工作要做才能通知vx_graph
更改。
相关文章:
- Boost Graph Library,修复节点大小
- 如何从TBB :: Flow :: Graph中删除/取消消息
- Boost Graph库,depth_first_search未在MSVC中调用finish_edge
- 如何在Boost Graph库中的Grid_graph的边缘添加自定义属性
- TensorFlow从C 中的Graph Def获得形状
- 在Boost Graph库中选择给定顶点的随机进出邻居的有效方法
- 如何使用Boost Graph库使用循环中的循环设置相同的边缘重量
- Boost Graph库示例不编译
- 如何使用boost::graph dijkstra的算法,如果顶点属性是指针?
- 在Graph实现中,对和向量是如何工作的
- 带标签_Graph的Boost Graph bellman_ford_shortest_path
- 实现 graph 时未解析的重载函数类型 [int]
- 解决方法:"out of line definition of 'graph' does not match any declaration in 'graph'"
- Graph::printAllPaths
- Boost Graph库中边缘的随机访问(或其他快速访问)
- Bipartite graph c++
- C++ Asterik Graph
- Tensorflow Quantized Graph for Android
- 在 Boost.Graph 中向图形添加边
- Boost Graph Library:如何使用depth_first_visit,ColorMap的问题