int CVxParamArray::ReadFrame(int frameNumber) { // check if user specified input file to read from if (m_fileNameRead.length() < 1) return 0; // for single frame reads, there is no need to read the array again // as it is already read into the object if (!m_fileNameForReadHasIndex && frameNumber != m_captureFrameStart) { return 0; } // reading data from input file char fileName[MAX_FILE_NAME_LENGTH]; sprintf(fileName, m_fileNameRead.c_str(), frameNumber); FILE * fp = fopen(fileName, m_readFileIsBinary ? "rb" : "r"); if(!fp) { if (frameNumber >= (int)m_captureFrameStart) { // end of sequence detected for multiframe sequences return 1; } else ReportError("ERROR: Unable to open: %s\n", fileName); } size_t numItems = ReadFileIntoBuffer(fp, m_readFileIsBinary); fclose(fp); // set array size to numItems and write the data into array object ERROR_CHECK(vxTruncateArray(m_array, 0)); if (numItems > 0) { ERROR_CHECK(vxAddArrayItems(m_array, numItems, m_bufForRead, m_itemSize)); } // process user requested directives if (m_useSyncOpenCLWriteDirective) { ERROR_CHECK_AND_WARN(vxDirective((vx_reference)m_array, VX_DIRECTIVE_AMD_COPY_TO_OPENCL), VX_ERROR_NOT_ALLOCATED); } return 0; }
// nodeless version of the Fast9Corners kernel vx_status vxFast9Corners(vx_image src, vx_scalar sens, vx_scalar nonm, vx_array points, vx_scalar s_num_corners, vx_border_mode_t *bordermode) { vx_float32 b = 0.0f; vx_imagepatch_addressing_t src_addr; void *src_base = NULL; vx_rectangle_t rect; vx_uint8 tolerance = 0; vx_bool do_nonmax; vx_uint32 num_corners = 0; vx_size dst_capacity = 0; vx_keypoint_t kp; vx_status status = vxGetValidRegionImage(src, &rect); status |= vxReadScalarValue(sens, &b); status |= vxReadScalarValue(nonm, &do_nonmax); /* remove any pre-existing points */ status |= vxTruncateArray(points, 0); status |= vxAccessImagePatch(src, &rect, 0, &src_addr, &src_base, VX_READ_ONLY); tolerance = (vx_uint8)b; status |= vxQueryArray(points, VX_ARRAY_ATTRIBUTE_CAPACITY, &dst_capacity, sizeof(dst_capacity)); memset(&kp, 0, sizeof(kp)); if (status == VX_SUCCESS) { /*! \todo implement other Fast9 Corners border modes */ if (bordermode->mode == VX_BORDER_MODE_UNDEFINED) { vx_int32 y, x; for (y = APERTURE; y < (vx_int32)(src_addr.dim_y - APERTURE); y++) { for (x = APERTURE; x < (vx_int32)(src_addr.dim_x - APERTURE); x++) { vx_uint8 strength = vxGetFastCornerStrength(x, y, src_base, &src_addr, tolerance); if (strength > 0) { if (do_nonmax) { if (strength >= vxGetFastCornerStrength(x-1, y-1, src_base, &src_addr, tolerance) && strength >= vxGetFastCornerStrength(x, y-1, src_base, &src_addr, tolerance) && strength >= vxGetFastCornerStrength(x+1, y-1, src_base, &src_addr, tolerance) && strength >= vxGetFastCornerStrength(x-1, y, src_base, &src_addr, tolerance) && strength > vxGetFastCornerStrength(x+1, y, src_base, &src_addr, tolerance) && strength > vxGetFastCornerStrength(x-1, y+1, src_base, &src_addr, tolerance) && strength > vxGetFastCornerStrength(x, y+1, src_base, &src_addr, tolerance) && strength > vxGetFastCornerStrength(x+1, y+1, src_base, &src_addr, tolerance)) ; else continue; } if (num_corners < dst_capacity) { kp.x = x; kp.y = y; kp.strength = strength; status |= vxAddArrayItems(points, 1, &kp, 0); } num_corners++; } } } } else { status = VX_ERROR_NOT_IMPLEMENTED; } if (s_num_corners) status |= vxWriteScalarValue(s_num_corners, &num_corners); status |= vxCommitImagePatch(src, NULL, 0, &src_addr, src_base); } return status; }