int CVxParamDistribution::CompareFrame(int frameNumber) { // check if there is no user request to compare if (m_fileNameCompare.length() < 1) return 0; // make sure m_bufForRead is allocated if (!m_bufForCompare) NULLPTR_CHECK(m_bufForCompare = new vx_uint32[m_numBins]); // reading data from reference file char fileName[MAX_FILE_NAME_LENGTH]; sprintf(fileName, m_fileNameCompare.c_str(), frameNumber); FILE * fp = fopen(fileName, m_compareFileIsBinary ? "rb" : "r"); if (!fp) { ReportError("ERROR: Unable to open: %s\n", fileName); } int status = ReadFileIntoBuffer(fp, m_bufForCompare); fclose(fp); if (status) ReportError("ERROR: distribution compare reference doesn't have enough data: %s\n", fileName); // compare and report error if mismatched vx_uint32 * bufRef = nullptr; ERROR_CHECK(vxAccessDistribution(m_distribution, (void **)&bufRef, VX_READ_ONLY)); status = memcmp(bufRef, m_bufForCompare, m_numBins * sizeof(vx_uint32)) ? -1 : 0; ERROR_CHECK(vxCommitDistribution(m_distribution, bufRef)); if (status) { m_compareCountMismatches++; printf("ERROR: distribution COMPARE MISMATCHED for %s with frame#%d of %s\n", GetVxObjectName(), frameNumber, fileName); if (!m_discardCompareErrors) return -1; } else { m_compareCountMatches++; if (m_verbose) printf("OK: distribution COMPARE MATCHED for %s with frame#%d of %s\n", GetVxObjectName(), frameNumber, fileName); } return 0; }
int CVxParamDistribution::ReadFrame(int frameNumber) { // check if there is no user request to read if (m_fileNameRead.length() < 1) return 0; // for single frame reads, there is no need to read it 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 == m_captureFrameStart) { ReportError("ERROR: Unable to open: %s\n", fileName); } else { return 1; // end of sequence detected for multiframe sequences } } vx_uint32 * data = nullptr; ERROR_CHECK(vxAccessDistribution(m_distribution, (void **)&data, VX_WRITE_ONLY)); int status = ReadFileIntoBuffer(fp, data); ERROR_CHECK(vxCommitDistribution(m_distribution, data)); fclose(fp); return status; }
int CVxParamDistribution::WriteFrame(int frameNumber) { // check if there is no user request to write if (m_fileNameWrite.length() < 1) return 0; // reading data from input file char fileName[MAX_FILE_NAME_LENGTH]; sprintf(fileName, m_fileNameWrite.c_str(), frameNumber); FILE * fp = fopen(fileName, m_writeFileIsBinary ? "wb" : "w"); if (!fp) ReportError("ERROR: Unable to create: %s\n", fileName); vx_uint32 * data = nullptr; ERROR_CHECK(vxAccessDistribution(m_distribution, (void **)&data, VX_READ_ONLY)); if (m_writeFileIsBinary) { // write in BINARY mode fwrite(data, sizeof(data[0]), m_numBins, fp); } else { // write in ASCII mode for (size_t i = 0; i < m_numBins; i++) fprintf(fp, "%8d\n", data[i]); } ERROR_CHECK(vxCommitDistribution(m_distribution, data)); fclose(fp); return 0; }
static vx_status vxHistogramKernel(vx_node node, vx_reference *parameters, vx_uint32 num) { vx_status status = VX_FAILURE; if (num == 2) { vx_image src_image = (vx_image)parameters[0]; vx_distribution dist = (vx_scalar)parameters[1]; vx_rectangle src_rect; vx_imagepatch_addressing_t src_addr; void *src_base = NULL, *dist_ptr = NULL; vx_fourcc format = 0; vx_uint32 y = 0, x = 0; vx_uint32 offset = 0, range = 0, numBins = 0, window_size = 0; vxQueryImage(src_image, VX_IMAGE_ATTRIBUTE_FORMAT, &format, sizeof(format)); vxQueryDistribution(dist, VX_DISTRIBUTION_ATTRIBUTE_BINS, &numBins, sizeof(numBins)); vxQueryDistribution(dist, VX_DISTRIBUTION_ATTRIBUTE_RANGE, &range, sizeof(range)); vxQueryDistribution(dist, VX_DISTRIBUTION_ATTRIBUTE_OFFSET, &offset, sizeof(offset)); vxQueryDistribution(dist, VX_DISTRIBUTION_ATTRIBUTE_WINDOW, &window_size, sizeof(window_size)); src_rect = vxGetValidRegionImage(src_image); status = VX_SUCCESS; status |= vxAccessImagePatch(src_image, src_rect, 0, &src_addr, &src_base); status |= vxAccessDistribution(dist, &dist_ptr); printf("distribution:%p bins:%u off:%u ws:%u range:%u\n", dist_ptr, numBins, offset, window_size, range); if (status == VX_SUCCESS) { vx_int32 *dist_tmp = dist_ptr; /* clear the distribution */ for (x = 0; x < numBins; x++) { dist_tmp[x] = 0; } for (y = 0; y < src_addr.dim_y; y++) { for (x = 0; x < src_addr.dim_x; x++) { if (format == FOURCC_U8) { vx_uint8 *src_ptr = vxFormatImagePatchAddress2d(src_base, x, y, &src_addr); vx_uint8 pixel = *src_ptr; if ((offset <= (vx_size)pixel) && ((vx_size)pixel < (offset+range))) { vx_size index = (pixel - (vx_uint16)offset) / window_size; dist_tmp[index]++; } } else if (format == FOURCC_U16) { vx_uint16 *src_ptr = vxFormatImagePatchAddress2d(src_base, x, y, &src_addr); vx_uint16 pixel = *src_ptr; if ((offset <= (vx_size)pixel) && ((vx_size)pixel < (offset+range))) { vx_size index = (pixel - (vx_uint16)offset) / window_size; dist_tmp[index]++; } } } } } status |= vxCommitDistribution(dist, dist_ptr); status |= vxCommitImagePatch(src_image, 0, 0, &src_addr, src_base); vxReleaseParameter(&src_rect); } return status; }