OpenCV:FileStorage运算符">>"在一个项目中工作但在另一个项目中工作(在同一个班级上)

时间:2017-05-26 11:25:45

标签: c++ windows opencv templates operator-overloading

在一个项目中(配置类型:exe ),我已经实现了现成的相机校准代码found here。 (docs here

在此代码中,有以下几行:

#include "stdafx.h"
#include "Settings.h"
using namespace cv;
using namespace std;
int main(int argc, char* argv[])
{
    Settings s;
    const string inputSettingsFile = argc > 1 ? argv[1] : "config.xml";
    FileStorage fs(inputSettingsFile, FileStorage::READ); // Read the settings
    fs["Settings"] >> s; // This works like a charm!
...

设置类非常简单,并且"实现" "阅读" CV 重载>> 模板所需的功能。

void read(const FileNode& node)
{
    node["BoardSize_Width"] >> boardSize.width;
    node["BoardSize_Height"] >> boardSize.height;
...

立即,

我正在尝试在另一个项目中使用相同的类(配置类型:dll ),如下所示:

#include "stdafx.h"
#include "ReadCalibration.h"
#include "..\..\..\CamCalib\CamCalib\Settings.h" // this is the SAME file used above

using namespace std;
using namespace cv;

bool ReadCalibration::init(const string inputSettingsFile)
{
    Settings se;
    FileStorage fs(inputSettingsFile, FileStorage::READ);   // Read the settings
    fs["Settings"] >> se; // ERROR !!!
  

错误C2665' cv :: read&#39 ;:14个重载中没有一个可以转换所有的   参数类型c:\ users \ kotsias \ documents \ visual studio   2015 \ projects \ opencv \ build \ include \ opencv2 \ core \ persistence.hpp 1169

在这两种情况下,都使用相同的源文件( opencv2 \ core \ persistence.hpp ),因此不需要引用错误的opencv安装。

之前我没有碰过这件事,看起来像是黑魔法。我的错误产生项目中有什么我可以设置的错误吗?

以下是 设置 类(在一个项目中有效,在另一个项目中没有):

#pragma once
#include <opencv2/core/core.hpp>

using namespace cv;
using namespace std;

class Settings
{
public:
    Settings() : goodInput(false) {}
    enum Pattern { NOT_EXISTING, CHESSBOARD, CIRCLES_GRID, ASYMMETRIC_CIRCLES_GRID };
    enum InputType { INVALID, CAMERA, VIDEO_FILE, IMAGE_LIST };

    void write(FileStorage& fs) const                        //Write serialization for this class
    {
        fs << "{" << "BoardSize_Width" << boardSize.width
            << "BoardSize_Height" << boardSize.height
            << "Square_Size" << squareSize
            << "Calibrate_Pattern" << patternToUse
            << "Calibrate_NrOfFrameToUse" << nrFrames
            << "Calibrate_FixAspectRatio" << aspectRatio
            << "Calibrate_AssumeZeroTangentialDistortion" << calibZeroTangentDist
            << "Calibrate_FixPrincipalPointAtTheCenter" << calibFixPrincipalPoint

            << "Write_DetectedFeaturePoints" << bwritePoints
            << "Write_extrinsicParameters" << bwriteExtrinsics
            << "Write_outputFileName" << outputFileName

            << "Show_UndistortedImage" << showUndistorsed

            << "Input_FlipAroundHorizontalAxis" << flipVertical
            << "Input_Delay" << delay
            << "Input" << input
            << "}";
    }

    void read(const FileNode& node)                          //Read serialization for this class
    {
        node["BoardSize_Width"] >> boardSize.width;
        node["BoardSize_Height"] >> boardSize.height;
        node["Calibrate_Pattern"] >> patternToUse;
        node["Square_Size"] >> squareSize;
        node["Calibrate_NrOfFrameToUse"] >> nrFrames;
        node["Calibrate_FixAspectRatio"] >> aspectRatio;
        node["Write_DetectedFeaturePoints"] >> bwritePoints;
        node["Write_extrinsicParameters"] >> bwriteExtrinsics;
        node["Write_outputFileName"] >> outputFileName;
        node["Calibrate_AssumeZeroTangentialDistortion"] >> calibZeroTangentDist;
        node["Calibrate_FixPrincipalPointAtTheCenter"] >> calibFixPrincipalPoint;
        node["Input_FlipAroundHorizontalAxis"] >> flipVertical;
        node["Show_UndistortedImage"] >> showUndistorsed;
        node["Input"] >> input;
        node["Input_Delay"] >> delay;
        interpret();
    }

    void interpret()
    {
        goodInput = true;
        if (boardSize.width <= 0 || boardSize.height <= 0)
        {
            cerr << "Invalid Board size: " << boardSize.width << " " << boardSize.height << endl;
            goodInput = false;
        }
        if (squareSize <= 10e-6)
        {
            cerr << "Invalid square size " << squareSize << endl;
            goodInput = false;
        }
        if (nrFrames <= 0)
        {
            cerr << "Invalid number of frames " << nrFrames << endl;
            goodInput = false;
        }

        if (input.empty())      // Check for valid input
            inputType = INVALID;
        else
        {
            if (input[0] >= '0' && input[0] <= '9')
            {
                stringstream ss(input);
                ss >> cameraID;
                inputType = CAMERA;
            }
            else
            {
                if (isListOfImages(input) && readStringList(input, imageList))
                {
                    inputType = IMAGE_LIST;
                    nrFrames = (nrFrames < (int)imageList.size()) ? nrFrames : (int)imageList.size();
                }
                else
                    inputType = VIDEO_FILE;
            }
            if (inputType == CAMERA)
                inputCapture.open(cameraID);
            if (inputType == VIDEO_FILE)
                inputCapture.open(input);
            if (inputType != IMAGE_LIST && !inputCapture.isOpened())
                inputType = INVALID;
        }
        if (inputType == INVALID)
        {
            cerr << " Inexistent input: " << input;
            goodInput = false;
        }

        flag = 0;
        if (calibFixPrincipalPoint) flag |= CV_CALIB_FIX_PRINCIPAL_POINT;
        if (calibZeroTangentDist)   flag |= CV_CALIB_ZERO_TANGENT_DIST;
        if (aspectRatio)            flag |= CV_CALIB_FIX_ASPECT_RATIO;


        calibrationPattern = NOT_EXISTING;
        if (!patternToUse.compare("CHESSBOARD")) calibrationPattern = CHESSBOARD;
        if (!patternToUse.compare("CIRCLES_GRID")) calibrationPattern = CIRCLES_GRID;
        if (!patternToUse.compare("ASYMMETRIC_CIRCLES_GRID")) calibrationPattern = ASYMMETRIC_CIRCLES_GRID;
        if (calibrationPattern == NOT_EXISTING)
        {
            cerr << " Inexistent camera calibration mode: " << patternToUse << endl;
            goodInput = false;
        }
        atImageList = 0;

    }
    Mat nextImage()
    {
        Mat result;
        if (inputCapture.isOpened())
        {
            Mat view0;
            inputCapture >> view0;
            view0.copyTo(result);
        }
        else if (atImageList < (int)imageList.size())
            result = imread(imageList[atImageList++], CV_LOAD_IMAGE_COLOR);

        return result;
    }

    static bool readStringList(const string& filename, vector<string>& l)
    {
        l.clear();
        FileStorage fs(filename, FileStorage::READ);
        if (!fs.isOpened())
            return false;
        FileNode n = fs.getFirstTopLevelNode();
        if (n.type() != FileNode::SEQ)
            return false;
        FileNodeIterator it = n.begin(), it_end = n.end();
        for (; it != it_end; ++it)
            l.push_back((string)*it);
        return true;
    }

    static bool isListOfImages(const string& filename)
    {
        string s(filename);
        // Look for file extension
        if (s.find(".xml") == string::npos && s.find(".yaml") == string::npos && s.find(".yml") == string::npos)
            return false;
        else
            return true;
    }

    Size boardSize;            // The size of the board -> Number of items by width and height
    Pattern calibrationPattern;// One of the Chessboard, circles, or asymmetric circle pattern
    float squareSize;          // The size of a square in your defined unit (point, millimeter,etc).
    int nrFrames;              // The number of frames to use from the input for calibration
    float aspectRatio;         // The aspect ratio
    int delay;                 // In case of a video input
    bool bwritePoints;         //  Write detected feature points
    bool bwriteExtrinsics;     // Write extrinsic parameters
    bool calibZeroTangentDist; // Assume zero tangential distortion
    bool calibFixPrincipalPoint;// Fix the principal point at the center
    bool flipVertical;          // Flip the captured images around the horizontal axis
    string outputFileName;      // The name of the file where to write
    bool showUndistorsed;       // Show undistorted images after calibration
    string input;               // The input ->

    int cameraID;
    vector<string> imageList;
    int atImageList;
    VideoCapture inputCapture;
    InputType inputType;
    bool goodInput;
    int flag;

private:
    string patternToUse;

};

1 个答案:

答案 0 :(得分:0)

似乎我找到了罪魁祸首。在我的第一个项目中,声明了这个静态函数,显然,OpenCV的cv :: read(...)函数引用了(不知何故)。评论这个产生了同样的错误。

我想我应该在尝试进行花哨的语法化之前先研究一下这些文档。

checkurl=url=>url.replace("http://","").replace("https://","").replace("www.","").replace("youtu.be/","youtube.com?v=").slice(0,14)==="youtube.com?v=";

PS。像这样的东西让我质疑C ++作为一种语言的质量。发现这样的错误真是太模糊了。