Выбор типа проекта VS (C ++) - PullRequest
0 голосов
/ 25 марта 2010

Я не очень часто использую C ++ (я стараюсь придерживаться более простых вещей, таких как Java и VB.NET), но в последнее время у меня не было выбора. Когда я выбираю тип проекта в VS для какого-либо источника C ++, который я загружаю, какой тип проекта мне выбрать? Я просто придерживался консольных приложений Win32, но я только что скачал некоторый код (ниже), который не будет работать правильно, даже если он компилируется без ошибок. Я пытался использовать консольное приложение CLR и пустой проект тоже, и по ходу дела изменил много переменных, но я не могу заставить этот код работать. Я заметил, что этот код не имеет "int main()" в начале, это как-то связано с этим? В любом случае, вот код, получил его от здесь :

/* 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

Если я поставлю ...

#include "stdafx.h"


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

... перед предыдущим кодом (и связать его с правильными файлами .lib OpenCV) он компилируется без ошибок, но ничего не делает в командной строке. Как мне заставить это работать?

Ответы [ 2 ]

2 голосов
/ 25 марта 2010

Попробуйте использовать Новый проект -> Visual C ++ -> Win32 -> Консольное приложение Win32. Вы можете использовать все значения по умолчанию, чтобы получить новый файл .cpp для проекта, в котором будет находиться _tmain. Измените _tmain следующим образом:

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

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

, а затем установите свойства проекта -> Свойства конфигурации -> Общие -> Набор символов по умолчанию «Использовать набор символов Юникода» на «Использовать многобайтовый набор символов». (Пока вы не измените это, вы получите ошибку компилятора при передаче _TCHAR * [] в качестве символа **.)

Затем просто добавьте ваш исходный файл в проект без изменений и посмотрите, сможете ли вы его скомпилировать и связать. Затем запустите его из окна консоли без аргументов, чтобы увидеть, получите ли вы эти пять отпечатков с выводом «Использование: ...».

(Когда я перечитываю ваш вопрос, я вижу, что вы используете консольное приложение Win32, так что в этом случае это может быть просто Unicode против многобайтового набора символов, который доставляет вам проблемы.)

(Принимая значения по умолчанию для нового проекта, вам также необходимо выбрать добавленный существующий исходный файл, перейти в Свойства -> Свойства конфигурации -> C / C ++ -> Предварительно скомпилированные заголовки -> Создать / использовать предварительно скомпилированные заголовки и установите для него значение «Не использовать предварительно скомпилированные заголовки».)

0 голосов
/ 25 марта 2010

Когда ваше приложение c ++ запускается, оно ищет

int main(int argc, char** argv) 

функция. Однако в Windows это может принимать форму

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

Вы можете смело предположить, что оба они эквивалентны, просто написаны по-разному. Когда приложение запускается, оно загружает ваш _tmain, а затем возвращает 0, поэтому вы не видите никакого вывода, это нормально.

Вам нужно переименовать int maina (...) в int _tmain (...)

...