vxHarrisCornersNode does not fill keypoints array

Hi,

I have a problem that vxHarrisCornersNode does not put the keypoints of the features in the array. I cant find what is going wrong. I hope someone here can find the problem or has any idea where it might go wrong.

My code does capture the camera correctly, it does convert the image correctly from OpenCV to OpenVX, it even renders the OpenVX image correctly. But the keypoints array stays empty so these are not rendered.

Here is my code:

#include “opencv2/opencv.hpp”
#include <VX/vx.h>
#include <NVX/nvx_opencv_interop.hpp>
#include <OVX/RenderOVX.hpp>
#include
#include <OVX/UtilityOVX.hpp>

// Macros for OpenVX error checking

//Check whether the status is VX_SUCCES
#define ERROR_CHECK_STATUS( status ) {
vx_status status_ = (status);
if(status_ != VX_SUCCESS) {
printf("ERROR: failed with status = (%d) at " FILE “#%d\n”, status_, LINE);
exit(1);
}
}

//Check whether the object creation is successful
#define ERROR_CHECK_OBJECT( obj ) {
vx_status status_ = vxGetStatus((vx_reference)(obj));
if(status_ != VX_SUCCESS) {
printf("ERROR: failed with status = (%d) at " FILE “#%d\n”, status_, LINE);
exit(1);
}
}

//Main function

int main() {

//Open Camera
cv::VideoCapture cap(“nvcamerasrc ! video/x-raw(memory:NVMM), width=720, height=460, format=NV12, framerate=60/1 ! nvvidconv ! video/x-raw, format=BGRx ! videoconvert ! video/x-raw, format=BGR ! appsink”, cv::CAP_GSTREAMER);

if (!cap.isOpened()) {
std::cout << “Camera did not open” << std::endl;
return -1;
}

//Parameters & Variables

vx_uint32 width = 720;
vx_uint32 height = 460;
vx_size max_keypoint_count = 10000;
vx_float32 harris_strength_thresh = 0.0005f;
vx_float32 harris_min_distance = 5.0f;
vx_float32 harris_sensitivity = 0.04f;
vx_int32 harris_gradient_size = 3;
vx_int32 harris_block_size = 3;

//Context

vx_context context = vxCreateContext();
ERROR_CHECK_OBJECT( context );

//Graph
vx_graph graph = vxCreateGraph( context );
ERROR_CHECK_OBJECT( graph );

//Images OpenCV

cv::Mat CVimageBGR;
cv::Mat CVimageRGB;

//Images OpenVX

vx_image VXimageRGB = vxCreateImage( context, width, height, VX_DF_IMAGE_RGB );
ERROR_CHECK_OBJECT( VXimageRGB );
vx_image VXimageYUV = vxCreateVirtualImage( graph, width, height, VX_DF_IMAGE_IYUV );
ERROR_CHECK_OBJECT( VXimageYUV );
vx_image VXimageGRAY = vxCreateVirtualImage( graph, width, height, VX_DF_IMAGE_U8 );
ERROR_CHECK_OBJECT( VXimageGRAY );

//Keypoint Array

vx_array keypoint_array = vxCreateArray( context, VX_TYPE_KEYPOINT, max_keypoint_count );
ERROR_CHECK_OBJECT( keypoint_array );

//Scalars
vx_scalar strength_thresh = vxCreateScalar( context, VX_TYPE_FLOAT32, &harris_strength_thresh );
ERROR_CHECK_OBJECT( strength_thresh );
vx_scalar min_distance = vxCreateScalar( context, VX_TYPE_FLOAT32, &harris_min_distance );
ERROR_CHECK_OBJECT( min_distance );
vx_scalar sensitivity = vxCreateScalar( context, VX_TYPE_FLOAT32, &harris_sensitivity );
ERROR_CHECK_OBJECT( sensitivity );

//Render And Style
std::unique_ptrovxio::Render renderer( ovxio::createDefaultRender( context, “OpenVX”, 720, 460 ) );
ovxio::Render::FeatureStyle featureStyle = { { 255, 0, 0, 255 }, 4.0f };

//Node
vx_node node = {
vxColorConvertNode( graph, VXimageRGB, VXimageYUV ),
vxChannelExtractNode( graph, VXimageYUV, VX_CHANNEL_Y, VXimageGRAY ),
vxHarrisCornersNode( graph, VXimageGRAY, strength_thresh, min_distance, sensitivity, harris_gradient_size, harris_block_size, keypoint_array, NULL )
};
for( vx_size i = 0; i < sizeof( node ) / sizeof( node[0] ); i++ ){
ERROR_CHECK_OBJECT( node[i] );
ERROR_CHECK_STATUS( vxReleaseNode( &node[i] ) );
}
ERROR_CHECK_STATUS( vxReleaseImage( &VXimageYUV ) );
ERROR_CHECK_STATUS( vxReleaseImage( &VXimageGRAY ) );
ERROR_CHECK_STATUS( vxVerifyGraph( graph ) );

//Capturing And Processing Loop
while(true){

//Capture Camera And Convert To OpenVX
cap.read(CVimageBGR);
cv::cvtColor(CVimageBGR, CVimageRGB, cv::COLOR_BGR2RGB);
VXimageRGB = nvx_cv::createVXImageFromCVMat( context, CVimageRGB );
ERROR_CHECK_OBJECT( VXimageRGB );

//Process Graph
ERROR_CHECK_STATUS( vxProcessGraph( graph ) );

//Mark Keypoints
vx_size num_corners = 0;
ERROR_CHECK_STATUS( vxQueryArray( keypoint_array, VX_ARRAY_NUMITEMS, &num_corners, sizeof( num_corners ) ) );

if( num_corners > 0 )
{
renderer->putFeatures( keypoint_array, featureStyle );
}

renderer->putImage(VXimageRGB);
renderer->flush();

}

return 0;
}

Hi,

We have a similar sample to demonstrate nvxHarrisTrackNode.
Could you take a look first?
[VisionWorks-1.6-Samples]/demos/feature_tracker/feature_tracker.cpp

Thanks.