繁体   English   中英

OpenCV-C ++代码在Eclipse中运行,但不在终端中运行吗?

[英]OpenCV - C++ Code runs in Eclipse but not in terminal?

我正在尝试使Mohammad Reza Mostajabi( http://alum.sharif.ir/~mostajabi/Tutorial.html )的以下代码在带有OpenCV 2.4.6.1的Ubuntu 12.04下运行。 我对包含的库进行了一些小的更改,并在启动主文件后立即添加了“ cv :: initModule_nonfree()”。

#include "cv.h" 
#include "highgui.h"
#include "ml.h"
#include <stdio.h>
#include <iostream>
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/nonfree/nonfree.hpp>
#include <vector>

using namespace cv; 
using namespace std;

using std::cout;
using std::cerr;
using std::endl;
using std::vector;






char ch[30];

//--------Using SURF as feature extractor and FlannBased for assigning a new point to the nearest one in the dictionary
Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("FlannBased");
Ptr<DescriptorExtractor> extractor = new SurfDescriptorExtractor();
SurfFeatureDetector detector(500);
//---dictionary size=number of cluster's centroids
int dictionarySize = 1500;
TermCriteria tc(CV_TERMCRIT_ITER, 10, 0.001);
int retries = 1;
int flags = KMEANS_PP_CENTERS;
BOWKMeansTrainer bowTrainer(dictionarySize, tc, retries, flags);
BOWImgDescriptorExtractor bowDE(extractor, matcher);



void collectclasscentroids() {
    IplImage *img;
    int i,j;
    for(j=1;j<=4;j++)
    for(i=1;i<=60;i++){
        sprintf( ch,"%s%d%s%d%s","train/",j," (",i,").jpg");
                    const char* imageName = ch;
                    img = cvLoadImage(imageName,0);
                    vector<KeyPoint> keypoint;
                    detector.detect(img, keypoint);
                    Mat features;
                    extractor->compute(img, keypoint, features);
                    bowTrainer.add(features);
    }
return;
}



int main(int argc, char* argv[])
{
    cv::initModule_nonfree();
    int i,j;
    IplImage *img2;
    cout<<"Vector quantization..."<<endl;
    collectclasscentroids();
    vector<Mat> descriptors = bowTrainer.getDescriptors();
    int count=0;
    for(vector<Mat>::iterator iter=descriptors.begin();iter!=descriptors.end();iter++)
    {
        count+=iter->rows;
    }
    cout<<"Clustering "<<count<<" features"<<endl;
    //choosing cluster's centroids as dictionary's words
    Mat dictionary = bowTrainer.cluster();
    bowDE.setVocabulary(dictionary);
    cout<<"extracting histograms in the form of BOW for each image "<<endl;
    Mat labels(0, 1, CV_32FC1);
    Mat trainingData(0, dictionarySize, CV_32FC1);
    int k=0;
    vector<KeyPoint> keypoint1;
    Mat bowDescriptor1;
    //extracting histogram in the form of bow for each image 
for(j=1;j<=4;j++)
    for(i=1;i<=60;i++){


                    sprintf( ch,"%s%d%s%d%s","train/",j," (",i,").jpg");
                    const char* imageName = ch;
                    img2 = cvLoadImage(imageName,0);

                    detector.detect(img2, keypoint1);


                        bowDE.compute(img2, keypoint1, bowDescriptor1);

                        trainingData.push_back(bowDescriptor1);

                        labels.push_back((float) j);
    }



    //Setting up SVM parameters
    CvSVMParams params;
    params.kernel_type=CvSVM::RBF;
    params.svm_type=CvSVM::C_SVC;
    params.gamma=0.50625000000000009;
    params.C=312.50000000000000;
    params.term_crit=cvTermCriteria(CV_TERMCRIT_ITER,100,0.000001);
    CvSVM svm;



    printf("%s\n","Training SVM classifier");

    bool res=svm.train(trainingData,labels,cv::Mat(),cv::Mat(),params);

    cout<<"Processing evaluation data..."<<endl;


    Mat groundTruth(0, 1, CV_32FC1);
    Mat evalData(0, dictionarySize, CV_32FC1);
     k=0;
    vector<KeyPoint> keypoint2;
    Mat bowDescriptor2;


    Mat results(0, 1, CV_32FC1);;
    for(j=1;j<=4;j++)
    for(i=1;i<=60;i++){


                    sprintf( ch,"%s%d%s%d%s","eval/",j," (",i,").jpg");
                    const char* imageName = ch;
                    img2 = cvLoadImage(imageName,0);

                    detector.detect(img2, keypoint2);
                        bowDE.compute(img2, keypoint2, bowDescriptor2);

                        evalData.push_back(bowDescriptor2);
                        groundTruth.push_back((float) j);
                        float response = svm.predict(bowDescriptor2);
                        results.push_back(response);
    }



    //calculate the number of unmatched classes 
    double errorRate = (double) countNonZero(groundTruth- results) / evalData.rows;
    printf("%s%f","Error rate is ",errorRate);
    return 0;

}

完成此操作后,我可以毫无问题地编译代码。 我也可以在Eclipse中运行它,但是一旦尝试使其在终端中运行,我会收到以下错误消息:

“ OpenCV错误:添加文件/home/mark/Downloads/FP/opencv-2.4.6.1/modules/features2d/src/bagofwords.cpp中的声明失败(!_descriptors.empty()),第57行在引发'cv :: Exception'what()的实例what():/home/mark/Downloads/FP/opencv-2.4.6.1/modules/features2d/src/bagofwords.cpp:57:错误:(-215)!_descriptors.empty( )在函数中添加“

我已经尝试解决几天问题了,但是我无法摆脱这个错误。 我也尝试使用CodeBlocks做到这一点,这给了我同样的错误。 我将非常感谢您的帮助!

谢谢!

程序可能无法加载输入图像(从终端窗口启动时),因为找不到它们。 确保将输入图像复制到运行应用程序的目录中。 Eclipse可能具有不同的主目录,因此在Eclipse中启动该程序时它会看到该映像。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM