Hi I'm trying to use cvCompareHist to detect an object entering the frame all the methods seem to be returning a value except for cvCompareHist the code builds succesfully with no errors and crashes at runtime when I quick watch the cvCompreHist method I get an error "CX0017: Error:symbol "cvCompareHist" not found". Here's the code till that point
#include "opencv\cv.h"
#include"opencv2\core\core.hpp" // Basic OpenCV structures (cv::Mat, Scalar)
#include "opencv\highgui.h" // OpenCV window I/O
#include "opencv2\imgproc\imgproc.hpp"
#include <iostream> // for standard I/O
#include <string> // for strings
#include <iomanip> // for controlling float print precision
#include <sstream> // string to number conversion
#include <stdio.h>
void ImagesAreDifferent(IplImage* frame, IplImage* previousFrame);
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
cvNamedWindow( "Example2", CV_WINDOW_AUTOSIZE ); //creates window
//CvCapture* capture = cvCreateCameraCapture( -1); //to select camera
CvCapture* capture = cvCreateFileCapture("test video.mp4"); //uses test video
IplImage* frame; //holds one frame from the video/camera
IplImage* referenceFrame = NULL; //will hold the reference frame
IplImage* currentFrame = NULL;
IplImage* h_plane = NULL;
IplImage* s_plane = NULL;
IplImage* v_plane = NULL;
IplImage* h_planeC = NULL;
IplImage* s_planeC = NULL;
IplImage* v_planeC= NULL;
IplImage* previousFrame = NULL; //this is used to determine if the object is moving
/// Using 30 bins for hue and 32 for saturation
int h_bins = 30; int s_bins = 32;
// Build and fill the histogram
CvHistogram* frameA;
{
int hist_size[] = { h_bins, s_bins };
float h_ranges[] = { 0, 255 };
float s_ranges[] = { 0, 180 };
float* ranges[] = { h_ranges, s_ranges };
frameA = cvCreateHist( 2, hist_size, CV_HIST_ARRAY, ranges, 1 );
}
CvHistogram* frameB;
{
int hist_size[] = { h_bins, s_bins };
float h_ranges[] = { 0, 255 };
float s_ranges[] = { 0, 180 };
float* ranges[] = { h_ranges, s_ranges };
frameB = cvCreateHist( 2, hist_size, CV_HIST_ARRAY, ranges, 1 );
}
bool firstFrame = true;
while(1) //run indefinitely
{
frame = cvQueryFrame( capture ); //takes the next frame
//sets the reference frame
if(firstFrame)
{
//these are the three layers from the color scheme we are converting to
//the change in color scheme is for better comparison
h_plane = cvCreateImage( cvGetSize(frame), 8, 1);
s_plane = cvCreateImage( cvGetSize(frame), 8, 1);
v_plane = cvCreateImage( cvGetSize(frame), 8, 1);
referenceFrame = cvCreateImage(cvGetSize(frame), 8,3); //set the reference frame
cvCvtColor(frame, referenceFrame, CV_BGR2HSV); //change the color scheme
IplImage* referenceFrameArray[] = {h_plane, s_plane}; //put the h and s layers into an array for creation of the histogram
cvCvtPixToPlane( referenceFrame, h_plane, s_plane, v_plane, 0); //break the image into the three layers
cvCalcHist(referenceFrameArray, frameA, 0, 0); //calculate the histogram value
cvNormalizeHist( frameA, 1.0); //normalize the histogram
firstFrame = false;
}
else
{
//these are the three layers from the color scheme we are converting to for current frame
h_planeC = cvCreateImage( cvGetSize(frame), 8, 1);
s_planeC = cvCreateImage( cvGetSize(frame), 8, 1);
v_planeC = cvCreateImage( cvGetSize(frame), 8, 1);
//get histograms for fast simple comparison of frames
currentFrame = cvCreateImage(cvGetSize(frame), 8,3); //set the current frame
cvCvtColor(frame, currentFrame, CV_BGR2HSV); //change the color scheme
IplImage* currentFrameArray[] = {h_planeC, s_planeC}; //put the h and s layer into an array for creation of the histogram
cvCvtPixToPlane( currentFrame, h_planeC, s_planeC, v_planeC, 0); //break apart the image into the three layers
cvCalcHist(currentFrameArray, frameB, 0, 0); //calculate the histogram
cvNormalizeHist( frameB, 1.0); //normalise the histogram
//1.0 is a perfect match, 0.5 is a half match, -1 is complete mismatch
if(cvCompareHist(frameA, frameB, CV_COMP_CORREL) < 0.8)