【问题标题】:OpenCV in Linux: cannot obtain Mat size (cv::Size), returns only MSize [duplicate]Linux中的OpenCV:无法获取Mat大小(cv :: Size),仅返回MSize [重复]
【发布时间】:2014-08-22 05:04:35
【问题描述】:

我正在尝试使用我的 OpenCV 项目(使用 Ubuntu 14.04LTS、Eclipse CDT Indigo、OpenCV 2.4.9)切换到 Linux。我尝试在 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 

图像到calibrate()函数,函数中的参数声明为

Size &imageSize

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

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

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

然后它确实有效。这是为什么?此外,我注意到,在查看 Mat 属性时,该 size() 属性被视为 MSize 而不是常规的 cv::Size。但我不明白为什么,这可能是原因。

感谢您的帮助。

【问题讨论】:

    标签: c++ linux eclipse opencv


    【解决方案1】:

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

    错误:从“cv::Size”类型的右值对“cv::Size& {aka cv::Size_&}”类型的非常量引用无效初始化

    这几乎表明@Arelius 链接到副本是正确的。

    解决问题更改

    double calibrate(Size &imageSize)
    

    double calibrate(const Size &imageSize)
    

    【讨论】:

    • 是的,现在很清楚了。那行得通。非常感谢m8。当我有足够的代表时,我会投票。
    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多