Visual studio OPENCV ARUCO示例调试visual studio 2013

Visual studio OPENCV ARUCO示例调试visual studio 2013,visual-studio,opencv,aruco,Visual Studio,Opencv,Aruco,我正在opencv\u contrib\u master文件夹“samples”中的detect\u marker.cpp上工作。这个项目建得很成功 但当我调试时,它没有打开摄像头,并已退出,代码为0 我应该如何处理此代码 #include <opencv2/highgui.hpp> #include <opencv2/aruco.hpp> #include <iostream> using namespace std; using namespace cv

我正在opencv\u contrib\u master文件夹“samples”中的detect\u marker.cpp上工作。这个项目建得很成功 但当我调试时,它没有打开摄像头,并已退出,代码为0

我应该如何处理此代码

#include <opencv2/highgui.hpp>
#include <opencv2/aruco.hpp>
#include <iostream>

using namespace std;
using namespace cv;

namespace {
const char* about = "Basic marker detection";
const char* keys  =
        "{d        |       | dictionary: DICT_4X4_50=0, DICT_4X4_100=1, DICT_4X4_250=2,"
        "DICT_4X4_1000=3, DICT_5X5_50=4, DICT_5X5_100=5, DICT_5X5_250=6, DICT_5X5_1000=7, "
        "DICT_6X6_50=8, DICT_6X6_100=9, DICT_6X6_250=10, DICT_6X6_1000=11, DICT_7X7_50=12,"
        "DICT_7X7_100=13, DICT_7X7_250=14, DICT_7X7_1000=15, DICT_ARUCO_ORIGINAL = 16}"
        "{v        |       | Input from video file, if ommited, input comes from camera }"
        "{ci       | 0     | Camera id if input doesnt come from video (-v) }"
        "{c        |       | Camera intrinsic parameters. Needed for camera pose }"
        "{l        | 0.1   | Marker side lenght (in meters). Needed for correct scale in camera pose }"
        "{dp       |       | File of marker detector parameters }"
        "{r        |       | show rejected candidates too }";
}

/**
 */
static bool readCameraParameters(string filename, Mat &camMatrix, Mat &distCoeffs) {
    FileStorage fs(filename, FileStorage::READ);
    if(!fs.isOpened())
        return false;
    fs["camera_matrix"] >> camMatrix;
    fs["distortion_coefficients"] >> distCoeffs;
    return true;
}



/**
 */
static bool readDetectorParameters(string filename, Ptr<aruco::DetectorParameters> &params) {
    FileStorage fs(filename, FileStorage::READ);
    if(!fs.isOpened())
        return false;
    fs["adaptiveThreshWinSizeMin"] >> params->adaptiveThreshWinSizeMin;
    fs["adaptiveThreshWinSizeMax"] >> params->adaptiveThreshWinSizeMax;
    fs["adaptiveThreshWinSizeStep"] >> params->adaptiveThreshWinSizeStep;
    fs["adaptiveThreshConstant"] >> params->adaptiveThreshConstant;
    fs["minMarkerPerimeterRate"] >> params->minMarkerPerimeterRate;
    fs["maxMarkerPerimeterRate"] >> params->maxMarkerPerimeterRate;
    fs["polygonalApproxAccuracyRate"] >> params->polygonalApproxAccuracyRate;
    fs["minCornerDistanceRate"] >> params->minCornerDistanceRate;
    fs["minDistanceToBorder"] >> params->minDistanceToBorder;
    fs["minMarkerDistanceRate"] >> params->minMarkerDistanceRate;
    fs["doCornerRefinement"] >> params->doCornerRefinement;
    fs["cornerRefinementWinSize"] >> params->cornerRefinementWinSize;
    fs["cornerRefinementMaxIterations"] >> params->cornerRefinementMaxIterations;
    fs["cornerRefinementMinAccuracy"] >> params->cornerRefinementMinAccuracy;
    fs["markerBorderBits"] >> params->markerBorderBits;
    fs["perspectiveRemovePixelPerCell"] >> params->perspectiveRemovePixelPerCell;
    fs["perspectiveRemoveIgnoredMarginPerCell"] >> params->perspectiveRemoveIgnoredMarginPerCell;
    fs["maxErroneousBitsInBorderRate"] >> params->maxErroneousBitsInBorderRate;
    fs["minOtsuStdDev"] >> params->minOtsuStdDev;
    fs["errorCorrectionRate"] >> params->errorCorrectionRate;
    return true;
}



/**
 */
int main(int argc, char *argv[]) {
    CommandLineParser parser(argc, argv, keys);
    parser.about(about);

    if(argc < 2) {
        parser.printMessage();
        return 0;
    }

    int dictionaryId = parser.get<int>("d");
    bool showRejected = parser.has("r");
    bool estimatePose = parser.has("c");
    float markerLength = parser.get<float>("l");

    Ptr<aruco::DetectorParameters> detectorParams = aruco::DetectorParameters::create();
    if(parser.has("dp")) {
        bool readOk = readDetectorParameters(parser.get<string>("dp"), detectorParams);
        if(!readOk) {
            cerr << "Invalid detector parameters file" << endl;
            return 0;
        }
    }
    detectorParams->doCornerRefinement = true; // do corner refinement in markers

    int camId = parser.get<int>("ci");

    String video;
    if(parser.has("v")) {
        video = parser.get<String>("v");
    }

    if(!parser.check()) {
        parser.printErrors();
        return 0;
    }

    Ptr<aruco::Dictionary> dictionary =
        aruco::getPredefinedDictionary(aruco::PREDEFINED_DICTIONARY_NAME(cv::aruco::DICT_4X4_50));

    Mat camMatrix, distCoeffs;
    if(estimatePose) {
        bool readOk = readCameraParameters(parser.get<string>("c"), camMatrix, distCoeffs);
        if(!readOk) {
            cerr << "Invalid camera file" << endl;
            return 0;
        }
    }

    VideoCapture inputVideo;
    int waitTime;
    if(!video.empty()) {
        inputVideo.open(0);
        waitTime = 0;
    } else {
        inputVideo.open(camId);
        waitTime = 10;
    }

    double totalTime = 0;
    int totalIterations = 0;

    while(inputVideo.grab()) {
        Mat image, imageCopy;
        inputVideo.retrieve(image);

        double tick = (double)getTickCount();

        vector< int > ids;
        vector< vector< Point2f > > corners, rejected;
        vector< Vec3d > rvecs, tvecs;

        // detect markers and estimate pose
        aruco::detectMarkers(image, dictionary, corners, ids, detectorParams, rejected);
        if(estimatePose && ids.size() > 0)
            aruco::estimatePoseSingleMarkers(corners, 0.05, camMatrix, distCoeffs, rvecs,
                                             tvecs);

        double currentTime = ((double)getTickCount() - tick) / getTickFrequency();
        totalTime += currentTime;
        totalIterations++;
        if(totalIterations % 30 == 0) {
            cout << "Detection Time = " << currentTime * 1000 << " ms "
                 << "(Mean = " << 1000 * totalTime / double(totalIterations) << " ms)" << endl;
        }

        // draw results
        image.copyTo(imageCopy);
        if(ids.size() > 0) {
            aruco::drawDetectedMarkers(imageCopy, corners, ids);

            if(estimatePose) {
                for(unsigned int i = 0; i < ids.size(); i++)
                    aruco::drawAxis(imageCopy, camMatrix, distCoeffs, rvecs[i], tvecs[i],
                                    0.1);
            }
        }

        if(showRejected && rejected.size() > 0)
            aruco::drawDetectedMarkers(imageCopy, rejected, noArray(), Scalar(100, 0, 255));

        imshow("out", imageCopy);
        char key = (char)waitKey(waitTime);
        if(key == 27) break;
    }

    return 0;
}

#包括
#包括
#包括
使用名称空间std;
使用名称空间cv;
名称空间{
const char*about=“基本标记检测”;
常量字符*键=
{d | |字典:DICT_4X4_50=0,DICT_4X4_100=1,DICT_4X4_250=2
“DICT_4X4_1000=3,DICT_5X5_50=4,DICT_5X5_100=5,DICT_5X5_250=6,DICT_5X5_1000=7,”
“DICT_6X6_50=8,DICT_6X6_100=9,DICT_6X6_250=10,DICT_6X6_1000=11,DICT_7X7_50=12,”
“DICT_7X7_100=13,DICT_7X7_250=14,DICT_7X7_1000=15,DICT_ARUCO_ORIGINAL=16}”
{v | |来自视频文件的输入,如果是ommited,则输入来自camera}
“{ci | 0 |如果输入不是来自视频(-v)}的摄像机id”
“{c | |相机内部参数。相机姿势需要}”
“{l | 0.1 |标记边长(以米为单位)。相机姿势中需要正确的比例}”
“{dp | |标记检测器参数文件}”
“{r | |也显示被拒绝的候选人}”;
}
/**
*/
静态bool readCameraParameters(字符串文件名、Mat和camMatrix、Mat和distcoefs){
FileStorage fs(文件名,FileStorage::READ);
如果(!fs.isOpened())
返回false;
fs[“摄像机矩阵”]>>摄像机矩阵;
fs[“失真系数”]>>失真系数;
返回true;
}
/**
*/
静态布尔readDetectorParameters(字符串文件名、Ptr和参数){
FileStorage fs(文件名,FileStorage::READ);
如果(!fs.isOpened())
返回false;
fs[“adaptiveThreshWinSizeMin”]>>params->adaptiveThreshWinSizeMin;
fs[“adaptiveThreshWinSizeMax”]>>params->adaptiveThreshWinSizeMax;
fs[“adaptiveThreshWinSizeStep”]>>params->adaptiveThreshWinSizeStep;
fs[“adaptiveThreshConstant”]>>参数->adaptiveThreshConstant;
fs[“minMarkerPerimeterRate”]>>参数->minMarkerPerimeterRate;
fs[“maxMarkerPerimeterRate”]>>参数->maxMarkerPerimeterRate;
fs[“Polygonalaproxaccuracyrate”]>>参数->Polygonalaproxaccuracyrate;
fs[“minCornerDistanceRate”]>>参数->minCornerDistanceRate;
fs[“minDistanceToBorder”]>>参数->minDistanceToBorder;
fs[“minMarkerDistanceRate”]>>参数->minMarkerDistanceRate;
fs[“doCornerRefinement”]>>参数->doCornerRefinement;
fs[“cornerRefinementWinSize”]>>参数->cornerRefinementWinSize;
fs[“cornerRefinementMaxIterations”]>>params->cornerRefinementMaxIterations;
fs[“cornerRefinementMinAccuracy”]>>参数->cornerRefinementMinAccuracy;
fs[“MarkerOrderBits”]>>参数->MarkerOrderBits;
fs[“PerspectiveEmovePixelPercell”]>>参数->PerspectiveEmovePixelPercell;
fs[“PerspectiveEmoviegnoredMarginPercell”]>>参数->PerspectiveEmoviegnoredMarginPercell;
fs[“MaxErrorBitsInBorderRate”]>>参数->MaxErrorBitsInBorderRate;
fs[“minOtsuStdDev”]>>参数->minOtsuStdDev;
fs[“errorCorrectionRate”]>>参数->errorCorrectionRate;
返回true;
}
/**
*/
int main(int argc,char*argv[]){
CommandLineParser解析器(argc、argv、键);
语法分析器.about(about);
如果(argc<2){
parser.printMessage();
返回0;
}
int dictionaryId=parser.get(“d”);
bool showRejected=parser.has(“r”);
bool estimatePose=parser.has(“c”);
float-markerLength=parser.get(“l”);
Ptr detectorParams=aruco::DetectorParameters::create();
if(parser.has(“dp”)){
bool readOk=readDetectorParameters(parser.get(“dp”),detectorParams);
如果(!readOk){
cerr角落,被拒绝;
向量rvecs,tvecs;
//检测标记并估计姿势
阿鲁科::检测标记(图像、字典、角落、ID、检测参数、拒绝);
if(估计姿势和ID.size()>0)
阿鲁科:估计位置单个标记(角点,0.05,camMatrix,距离系数,rvecs,
tvecs);
double currentTime=((double)getTickCount()-tick)/getTickFrequency();
总时间+=当前时间;
总迭代次数++;
如果(总迭代次数%30==0){

无法显示您正在使用的代码。目前,任何人都无法看到可能的错误。我刚刚添加了此代码。谢谢您的命令行参数是什么?就在这里:int main(int argc,char*argv[]){CommandLineParser parser(argc,argv,keys);parser.about(about);不,我不是这么问的。请找出命令行参数是什么,然后告诉我。