我正在尝试使用我的OpenCV项目切换到Linux(使用Ubuntu 14.04LTS,Eclipse CDT Indigo,OpenCV 2.4.9)。我尝试在Linux上运行我的一些应用程序,但我遇到了一个奇怪的问题。
我为您提供了简化代码(为清晰起见,删除了一些部分)。
#include <iostream>
#include "opencv2/opencv.hpp"
#include "PointGrayCap.h"
#include "CameraCalibrator.h"
#define CALIB_FRAMES 5
using namespace std;
using namespace cv;
int main() {
VideoCapture cam(1);
CameraCalibrator* calib = new CameraCalibrator(Size(9, 6), 0, true);
Mat image, grayFrame, cornerFrame;
bool stop = false; int counter = 0;
bool calibDone = false;
while (!stop) {
if (!cam.read(image)) {
break;
}
imshow("Color", image);
cvtColor(image, grayFrame, CV_BGR2GRAY);
calib->calibrate(grayFrame.size()); // <<<<<<< issue is here with this parameter.
//calibrate function is defined as:
/*
double calibrate(Size &imageSize)
{
//Output rotations and translations
vector<Mat> rotVecs, transVecs;
// start calibration
return calibrateCamera(objectPoints, // the 3D points
imagePoints, // the image points
imageSize, // image size
cameraMatrix, // output camera matrix
distCoeffs, // output distortion matrix
rotVecs, // Rs
transVecs, // Ts
flag); // set options
}
*/
//
cout << "Calibration done." << endl;
calib->outputCameraMatrix();
if (waitKey(10) == 27) {stop = true;}
}
return 0;
}
在这里,我应该传递
的大小grayFrame
image to calibrate()函数,函数中的参数声明为
Size &imageSize
你可以在代码中看到定义,评论部分显示校准功能的定义(在现实生活中它是单独的* .h文件)。
问题是eclipse会抛出一个错误,即没有与这些参数匹配的函数,即Size。这很奇怪,因为在Windows中它确实可以正常工作。但是,当我尝试重写对此函数的调用时:
Size mySize(grayFrame.cols, grayFrame.rows);
calib->calibrate(mySize);
然后就可以了。这是为什么?此外,我注意到,当通过Mat属性查看时,size()属性被视为MSize而不是常规的cv :: Size。但我无法理解为什么这可能是原因。
感谢您的帮助。
答案 0 :(得分:1)
我在Linux上尝试了这个,我得到了
错误:类型&#39; cv :: Size&amp;的非const引用的初始化无效{aka cv :: Size_&amp;}&#39;来自类型&#39; cv :: Size&#39;
的右值
这几乎说@Arelius链接到副本是正确的。
解决问题更改
double calibrate(Size &imageSize)
到
double calibrate(const Size &imageSize)