Visual studio OPENCV ARUCO示例调试visual studio 2013
我正在opencv\u contrib\u master文件夹“samples”中的detect\u marker.cpp上工作。这个项目建得很成功 但当我调试时,它没有打开摄像头,并已退出,代码为0 我应该如何处理此代码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
#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> ¶ms) {
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);不,我不是这么问的。请找出命令行参数是什么,然后告诉我。