为什么meanstdev()返回[nan]? 我想用C++中的OpenCV来计算图像的标准差。然而,我得到了非常奇怪的结果。 我的代码:

为什么meanstdev()返回[nan]? 我想用C++中的OpenCV来计算图像的标准差。然而,我得到了非常奇怪的结果。 我的代码:,c++,opencv,mat,standard-deviation,laplacian,C++,Opencv,Mat,Standard Deviation,Laplacian,等等。问题出在哪里?所以,到现在为止,我已经知道问题出在我自己身上了。不允许在cvtColor()和Laplacian()函数中使用同一变量两次,这意味着源和目标不能相同。像Python这样的其他编程语言能够处理这个问题,但是C++不能。 无论如何,下面是我获得图像拉普拉斯方差的正确代码: #include <iostream> #include <cmath> #include <opencv2/opencv.hpp> using namespace std

等等。问题出在哪里?

所以,到现在为止,我已经知道问题出在我自己身上了。不允许在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;
}
#包括
#包括
#包括
使用名称空间std;
使用名称空间cv;
双拉普拉斯(Mat*fr){
标量m,stdv;
垫灰色,圈;
CVT颜色(*fr,灰色,颜色为灰色);
拉普拉斯(灰色,圈,CV_64F);
平均dDev(圈数、米数、标准差、垫数);
返回功率(标准偏差值[0],2);
}
int main(){
垫架;
//在这里,您可以获得您的帧,例如,来自带帽子的视频等。
val=给定拉普拉斯(和框架);

在你展示的代码中,
frame
是未初始化的。做一个测试,也许我们可以检查一下。它没有。最好在这里更新之前在家编译:)那里没有循环,所以它怎么能打印多行呢?@tedlynmo我没见过,但我在生产中没有任何使用
VideoCapture
的东西。也可能来自它在您的案例中使用的任何videoio后端。
[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]
#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;
}