Linux下的OpenCV:无法获取Mat size (cv:: size),只返回MSize

OpenCV in Linux: cannot obtain Mat size (cv::Size), returns only MSize

本文关键字:size cv MSize 返回 Mat OpenCV 下的 获取 Linux      更新时间:2023-10-16

我正试图用我的OpenCV项目切换到Linux(使用Ubuntu 14.04LTS, Eclipse CDT Indigo, OpenCV 2.4.9)。我尝试在Linux上运行一些可以在Windows上运行的应用程序,但我遇到了一个奇怪的问题。

我为您提供了简化的代码(为了清晰起见删除了一些部分)。

#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用于校准()函数,函数中的参数声明为

Size &imageSize

您可以在代码中看到定义,注释部分揭示了校准函数的定义(在实际生活中它是单独的*.h文件)。

问题是eclipse抛出了一个错误,没有与这些参数匹配的函数,即Size。这很奇怪,因为在Windows中它确实工作得很好。但是,当我尝试像这样重写对函数的调用时:

Size mySize(grayFrame.cols, grayFrame.rows);
calib->calibrate(mySize);

那么它确实工作。为什么呢?此外,我注意到,当通过Mat属性查看时,该size()属性被视为MSize而不是常规cv:: size。但我不明白为什么,这可能就是原因。

我在Linux上尝试了这个,我得到

错误:cv类型的非const引用初始化无效::Size&{也称为cv::Size_&}'从类型为'cv::Size'的右值

这基本上说明@Arelius链接到副本是正确的。

修改

double calibrate(Size &imageSize)

double calibrate(const Size &imageSize)