【问题标题】:Why does meanStdDev() return [nan]?为什么 meanStdDev() 返回 [nan]?
【发布时间】:2020-03-24 15:58:05
【问题描述】:

我想在 C++ 中使用 OpenCV 计算图像的标准偏差。但是,我得到了非常奇怪的结果。 我的代码:

#include <iostream>
#include <stdio.h>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;

int main() {
    VideoCapture cap("Sample-Video.mp4");
    Mat frame;
    ret = cap.read(frame);

    Scalar m, stdv;
    cvtColor(frame, frame, COLOR_BGR2GRAY);
    Laplacian(frame, frame, CV_64F, 3);
    meanStdDev(frame, m, stdv);

    cout << stdv << endl;
}

它总是输出:

[0, 0, 0, 0]
[nan, 0, 0, 0]
[nan, 0, 0, 0]
[-nan, 0, 0, 0]
[-nan, 0, 0, 0]
[-nan, 0, 0, 0]
[nan, 0, 0, 0]
[nan, 0, 0, 0]
[nan, 0, 0, 0]
[nan, 0, 0, 0]
[nan, 0, 0, 0]
[nan, 0, 0, 0]

等等。问题出在哪里?

【问题讨论】:

  • 在您显示的代码中,frame 未初始化。
  • 创建一个minimal reproducible example,也许我们可以看看。
  • 它没有。在这里更新之前最好先在家编译一下:)
  • 里面没有循环,怎么打印多行呢?
  • @TedLyngmo 我没见过,但我没有在生产中使用 VideoCapture 的任何东西。也可能来自它在您的情况下使用的任何 videoio 后端。

标签: c++ opencv mat standard-deviation laplacian


【解决方案1】:

所以,到现在为止,我弄清楚了自己的问题所在。您不能在 cvtColor() 和 Laplacian() 函数中使用相同的变量两次,这意味着您的源和目标不能相同。其他编程语言如 Python 能够处理这个问题,而 C++ 却不能。

无论如何,这是我如何获得图像的拉普拉斯方差的正确代码:

#include <iostream>
#include <cmath>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;

double give_laplacian(Mat *fr) {
    Scalar m, stdv;
    Mat gray, lap;

    cvtColor(*fr, gray, COLOR_BGR2GRAY);
    Laplacian(gray, lap, CV_64F);
    meanStdDev(lap, m, stdv, Mat());

    return pow(stdv.val[0], 2);
}

int main() {
    Mat frame;

    //here you get your frame, e.g. from a video with a cap etc.

    val = give_laplacian(&frame);
    cout << "Sharpness value: " << val << endl;
}

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2017-05-10
    • 2010-11-28
    • 1970-01-01
    • 2015-05-20
    • 2021-06-25
    • 2020-01-07
    • 2011-10-23
    • 2017-03-26
    • 2021-06-18
    相关资源
    最近更新 更多