views:

212

answers:

2

Hi all, I do not use C++ much (I try to stick to the easier stuff like Java and VB.NET), but the lately I have not had a choice. When I am picking a project type in VS for some C++ source I download, what project type should I pick? I had just been sticking with Win32 Console Applications, but I just downloaded some code (below) that will not work right even when it compiles with out errors. I have tried to use a CLR Console Application and an empty project too, and have changed many variables along the way, but I cannot get this code to work. I noticed that this code does not have "int main()" at its beginning, does that have something to do with it? Anyways, here is the code, got it from here:

/* Demo of modified Lucas-Kanade optical flow algorithm.
   See the printf below */

#ifdef _CH_
#pragma package <opencv>
#endif

#ifndef _EiC
#include "cv.h"
#include "highgui.h"
#include <stdio.h>
#include <ctype.h>
#endif

#include <windows.h>

#define FULL_IMAGE_AS_OUTPUT_FILE


#define cvMirror cvFlip

//IplImage *image = 0, *grey = 0, *prev_grey = 0, *pyramid = 0, *prev_pyramid = 0, *swap_temp;
IplImage **buf = 0;
IplImage *image1 = 0;
IplImage *imageCopy=0;

IplImage *image = 0;
int win_size = 10;
const int MAX_COUNT = 500;
CvPoint2D32f* points[2] = {0,0}, *swap_points;
char* status = 0;
//int count = 0;
//int need_to_init = 0;
//int night_mode = 0;
int flags = 0;
//int add_remove_pt = 0;
bool bLButtonDown = false;
//bool bstopLoop = false;
CvPoint pt, pt1,pt2;
//IplImage* img1;
FILE* FileDest;

char* strImageDir = "E:\\Projects\\TSCreator\\Images";
char* strItemName = "b";
int  imageCount=0;  
int bFirstFace = 1;     // flag for first face
int mode = 1; // Mode 1 - Haar Traing Sample Creation, 2 - HMM sample creation, Mode = 3 - Both Harr and HMM.
//int startImgeNo = 1;
bool isEqualRation = false; //Weidth to height ratio is equal

//Selected Image data
IplImage *selectedImage = 0;
int selectedX = 0, selectedY = 0, currentImageNo = 0, selectedWidth = 0, selectedHeight= 0;
CvRect selectedROI;


void saveFroHarrTraining(IplImage *src, int x, int y, int width, int height, int imageCount);
void saveForHMMTraining(IplImage *src, CvRect roi,int imageCount);

// Code for draw  ROI Cropping Image
void on_mouse( int event, int x, int y, int flags, void* param )
{

char f[200];
CvRect reg;

         if( !image )
            return;

    if( event == CV_EVENT_LBUTTONDOWN )
    {
        bLButtonDown = true;

        pt1.x = x;
        pt1.y = y;

    }
    else if ( event == CV_EVENT_MOUSEMOVE ) //Draw the selected area rectangle
    {
        pt2.x = x;
        pt2.y = y;

        if(bLButtonDown)
        {
            if( !image1 )
        {
            /* allocate all the buffers */
            image1 = cvCreateImage( cvGetSize(image), 8, 3 );
            image1->origin = image->origin;
            points[0] = (CvPoint2D32f*)cvAlloc(MAX_COUNT*sizeof(points[0][0]));
            points[1] = (CvPoint2D32f*)cvAlloc(MAX_COUNT*sizeof(points[0][0]));
            status = (char*)cvAlloc(MAX_COUNT);
            flags = 0;
        }

        cvCopy( image, image1, 0 );     

        //Equal Weight-Height Ratio
            if(isEqualRation)
            {
                pt2.y = pt1.y + (pt2.x-pt1.x);
            }

            //Max Height and Width is the image width and height
            if(pt2.x>image->width)
            {
                pt2.x = image->width;
            }
            if(pt2.y>image->height)
            {
                pt2.y = image->height;
            }

            CvPoint InnerPt1 = pt1;
            CvPoint InnerPt2 = pt2;

            if ( InnerPt1.x > InnerPt2.x)
            {
                int tempX = InnerPt1.x;
                InnerPt1.x = InnerPt2.x;
                InnerPt2.x = tempX;
            }

            if ( pt2.y < InnerPt1.y )
            {
                int tempY = InnerPt1.y;
                InnerPt1.y = InnerPt2.y;
                InnerPt2.y = tempY;

            }

            InnerPt1.y = image->height - InnerPt1.y;
            InnerPt2.y = image->height - InnerPt2.y;    




            CvFont font;
            double hScale=1.0;
            double vScale=1.0;
            int    lineWidth=1;
            cvInitFont(&font,CV_FONT_HERSHEY_SIMPLEX|CV_FONT_ITALIC, hScale,vScale,0,lineWidth);

            char size [200];
            reg.x = pt1.x;
            reg.y = image->height - pt2.y;
            reg.height = abs (pt2.y - pt1.y);
            reg.width = InnerPt2.x -InnerPt1.x;
            //print width and heght of the selected reagion
            sprintf(size, "(%dx%d)",reg.width, reg.height);
            cvPutText (image1,size,cvPoint(10,10), &font, cvScalar(255,255,0));
            cvRectangle(image1, InnerPt1, InnerPt2, CV_RGB(255,0,0), 1);

            //Mark Selected Reagion
            selectedImage = image;
            selectedX = pt1.x;
            selectedY = pt1.y;
            selectedWidth = reg.width;
            selectedHeight = reg.height;
            selectedROI  = reg;

            //Show the modified image
            cvShowImage("HMM-Harr Positive Image Creator",image1);
        }

    }
    else if ( event == CV_EVENT_LBUTTONUP )
    {
        bLButtonDown = false;

//      pt2.x = x;
//      pt2.y = y;
//
//      if ( pt1.x > pt2.x)
//      {
//          int tempX = pt1.x;
//          pt1.x = pt2.x;
//          pt2.x = tempX;
//      }
//
//      if ( pt2.y < pt1.y )
//      {
//          int tempY = pt1.y;
//          pt1.y = pt2.y;
//          pt2.y = tempY;
//
//      }
//
//reg.x = pt1.x;
//reg.y = image->height - pt2.y;
//
//reg.height = abs (pt2.y - pt1.y);
////reg.width = reg.height/3;
//reg.width = pt2.x -pt1.x;
////reg.height = (2 * reg.width)/3;



#ifdef FULL_IMAGE_AS_OUTPUT_FILE
        CvRect FullImageRect;
        FullImageRect.x = 0;
        FullImageRect.y = 0;
        FullImageRect.width = image->width;
        FullImageRect.height = image->height;   

        IplImage *regionFullImage =0;
        regionFullImage = cvCreateImage(cvSize (FullImageRect.width, FullImageRect.height),
                                    image->depth, image->nChannels);

        image->roi = NULL;

        //cvSetImageROI (image, FullImageRect);
        //cvCopy (image, regionFullImage, 0);

#else
         IplImage *region =0;
         region = cvCreateImage(cvSize (reg.width, reg.height),            
                                image1->depth, image1->nChannels);

        image->roi = NULL;
        cvSetImageROI (image1, reg);

        cvCopy (image1, region, 0);
#endif
        //cvNamedWindow("Result", CV_WINDOW_AUTOSIZE);

        //selectedImage = image;
        //selectedX = pt1.x;
        //selectedY = pt1.y;
        //selectedWidth = reg.width;
        //selectedHeight = reg.height;
        ////currentImageNo = startImgeNo;
        //selectedROI  = reg;

        /*if(mode == 1)
        {
            saveFroHarrTraining(image,pt1.x,pt1.y,reg.width,reg.height,startImgeNo);
        }
        else if(mode == 2)
        {
            saveForHMMTraining(image,reg,startImgeNo);
        }
        else if(mode ==3)
        {
            saveFroHarrTraining(image,pt1.x,pt1.y,reg.width,reg.height,startImgeNo);
            saveForHMMTraining(image,reg,startImgeNo);
        }
        else
        {
            printf("Invalid mode.");
        }


        startImgeNo++;*/

    }
}

/*
Save popsitive samples for Harr Training. 
Also add an entry to the PositiveSample.txt with the location of the item of interest.
*/
void saveFroHarrTraining(IplImage *src, int x, int y, int width, int height, int imageCount)
{
    char f[255] ;
        sprintf(f,"%s\\%s\\harr_%s%d%d.jpg",strImageDir,strItemName,strItemName,imageCount/10, imageCount%10);

        cvNamedWindow("Harr", CV_WINDOW_AUTOSIZE);
        cvShowImage("Harr", src);
        cvSaveImage(f, src);


        printf("output%d%d \t ", imageCount/10, imageCount%10);
        printf("width %d \t", width);
        printf("height %d \t", height);
        printf("x1 %d \t", x);
        printf("y1 %d \t\n", y);

        char f1[255];
        sprintf(f1,"%s\\PositiveSample.txt",strImageDir);
        FileDest = fopen(f1, "a");
        fprintf(FileDest, "%s\\harr_%s%d.jpg 1 %d %d %d %d  \n",strItemName,strItemName, imageCount, x, y, width, height);
        fclose(FileDest);
}

/*
Create Sample Images for HMM recognition algorythm trai ning.
*/
void saveForHMMTraining(IplImage *src, CvRect roi,int imageCount)
{
    char f[255] ;
    printf("x=%d, y=%d, w= %d, h= %d\n",roi.x,roi.y,roi.width,roi.height);
    //Create the file name
    sprintf(f,"%s\\%s\\hmm_%s%d.pgm",strImageDir,strItemName,strItemName, imageCount);

    //Create storage for grayscale image
    IplImage* gray = cvCreateImage(cvSize(roi.width,roi.height), 8, 1);
    //Create storage for croped reagon
    IplImage* regionFullImage = cvCreateImage(cvSize(roi.width,roi.height),8,3);
    //Croped marked region
    cvSetImageROI(src,roi);
    cvCopy(src,regionFullImage);
    cvResetImageROI(src);
    //Flip croped image - otherwise it will saved upside down
    cvConvertImage(regionFullImage, regionFullImage, CV_CVTIMG_FLIP);
    //Convert croped image to gray scale
    cvCvtColor(regionFullImage,gray, CV_BGR2GRAY);
    //Show final grayscale image
    cvNamedWindow("HMM", CV_WINDOW_AUTOSIZE);
    cvShowImage("HMM", gray);
    //Save final grayscale image
    cvSaveImage(f, gray);
}

int maina( int argc, char** argv )
{
    CvCapture* capture = 0;
    //if( argc == 1 || (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0])))
    //    capture = cvCaptureFromCAM( argc == 2 ? argv[1][0] - '0' : 0 );
    //else if( argc == 2 )
    //    capture = cvCaptureFromAVI( argv[1] );

    char* video;

    if(argc ==7)
    {
        mode = atoi(argv[1]);
        strImageDir = argv[2];
        strItemName = argv[3];
        video = argv[4];
        currentImageNo = atoi(argv[5]);
        int a = atoi(argv[6]);
        if(a==1)
        {
            isEqualRation = true;
        }
        else
        {
            isEqualRation = false;
        }

    }
    else
    {
        printf("\nUsage: TSCreator.exe <Mode> <Sample Image Save Path> <Sample Image Save Directory> <Video File Location> <Start Image No> <Is Equal Ratio>\n");
        printf("Mode = 1 - Haar Traing Sample Creation. \nMode = 2 - HMM sample creation.\nMode = 3 - Both Harr and HMM\n");
        printf("Is Equal Ratio = 0 or 1. 1 - Equal weidth and height, 0 - custom.");
        printf("Note: You have to create the image save directory in correct path first.\n");
        printf("Eg: TSCreator.exe 1 E:\Projects\TSCreator\Images A 11.avi 1 1\n\n");
        return 0;
    }
      capture = cvCaptureFromAVI(video);

    if( !capture )
    {
        fprintf(stderr,"Could not initialize capturing...\n");
        return -1;
    }

    cvNamedWindow("HMM-Harr Positive Image Creator", CV_WINDOW_AUTOSIZE);
    cvSetMouseCallback("HMM-Harr Positive Image Creator", on_mouse, 0);
    //cvShowImage("Test", image1);

    for(;;)
    {
        IplImage* frame = 0;
        int i, k, c;

        frame = cvQueryFrame( capture );
        if( !frame )
            break; 

        if( !image )
        {
            /* allocate all the buffers */
            image = cvCreateImage( cvGetSize(frame), 8, 3 );
            image->origin = frame->origin;
            //grey = cvCreateImage( cvGetSize(frame), 8, 1 );
            //prev_grey = cvCreateImage( cvGetSize(frame), 8, 1 );
            //pyramid = cvCreateImage( cvGetSize(frame), 8, 1 );
           // prev_pyramid = cvCreateImage( cvGetSize(frame), 8, 1 );
            points[0] = (CvPoint2D32f*)cvAlloc(MAX_COUNT*sizeof(points[0][0]));
            points[1] = (CvPoint2D32f*)cvAlloc(MAX_COUNT*sizeof(points[0][0]));
            status = (char*)cvAlloc(MAX_COUNT);
            flags = 0;
        }

        cvCopy( frame, image, 0 );
       // cvCvtColor( image, grey, CV_BGR2GRAY );


        cvShowImage("HMM-Harr Positive Image Creator", image);
        cvSetMouseCallback("HMM-Harr Positive Image Creator", on_mouse, 0);
         c = cvWaitKey(0);
         if((char)c == 's')
         {
            //Save selected reagion as training data
             if(selectedImage)
             {
                 printf("Selected Reagion Saved\n");
                if(mode == 1)
                {
                    saveFroHarrTraining(selectedImage,selectedX,selectedY,selectedWidth,selectedHeight,currentImageNo);
                }
                else if(mode == 2)
                {
                    saveForHMMTraining(selectedImage,selectedROI,currentImageNo);
                }
                else if(mode ==3)
                {
                    saveFroHarrTraining(selectedImage,selectedX,selectedY,selectedWidth,selectedHeight,currentImageNo);
                    saveForHMMTraining(selectedImage,selectedROI,currentImageNo);
                }
                else
                {
                    printf("Invalid mode.");
                }
                currentImageNo++;
             }      

         }

    }

    cvReleaseCapture( &capture );
    //cvDestroyWindow("HMM-Harr Positive Image Creator");
    cvDestroyAllWindows();

    return 0;
}

#ifdef _EiC
main(1,"lkdemo.c");
#endif

If I put...

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}

... before the previous code (and link it to the correct OpenCV .lib files) it compiles without errors, but does nothing at the command line. How do I make it work?

+2  A: 

Try using New Project -> Visual C++ -> Win32 -> Win32 Console Application. You can take all the defaults to get a new .cpp file for the project, which will have a _tmain in it. Modify _tmain like this:

int maina( int argc, char** argv ); // add this

int _tmain(int argc, _TCHAR* argv[])
{
    return maina(argc, argv); // call maina from here
}

and then set the project Properties -> Configuration Properties -> General -> Character Set from the default of "Use Unicode Character Set" to "Use Multi-Byte Character Set". (Until you change this, you'll get a compiler error on passing the _TCHAR*[] as a char**.)

Then just add your source file to the project unmodified, and see if you can get it to compile and link. Then run it from a console window without any args to see if you get those five prints worth of "Usage: ..." output.

(As I re-read your question I see you are using Win32 Console Application, so in this case it may just be Unicode vs. Multi-Byte Character Set that is giving you trouble.)

(Taking the defaults for a new project, you'll also need to select the added, existing source file, go to Properties -> Configuration Properties -> C/C++ -> Precompiled Headers -> Create/Use Precompiled Headers and set it to Not Using Precompiled Headers.)

Jim Flood
You sir are the man. Just a note though, it worked with and without precompiled headers. Since I am a C++ noob (and a programming noob in general) can you explain a few things to me? 1.) How can I know when to change the character set, precompiled headers, common language runtime support, ect? 2.) Win32 vs CLR, what is the difference and which should I pick by default? 3.) Do you think the person that developed the source code that I posted intended for a person to have to do this? I would have assumed such code would be posted SSCCE style... Thanks again!
typoknig
Using Multi-Byte was just a guess. If you see wchar_t instead of char, it's probably using Unicode. Google "_MBCS _UNICODE" to find lots of related info.You should never need precompiled headers to get it to work -- they are just there to speed up the compiles. I can't think of an example scenario, but they can get out of sync -- when in doubt, rebuild the whole project to regenerate them.You'll need CLR only if the C++ is using .NET, AFAIK. In that case, the C++/CLI syntax should stand out, e.g. String^ myString.
Jim Flood
A: 

When your c++ application starts, it searches for an

int main(int argc, char** argv) 

function. However, in windows, this can take the form of

int _tmain(int argc, _TCHAR* argv[])

You can safely assume that both are equivalent, just written differently. When the application starts, it loads your _tmain, then returns 0, so you don't see any output, this is normal.

What you need is to rename int maina(...) to int _tmain(...)

Eric