为什么 meanStdDev() return [nan]?
Why does meanStdDev() return [nan]?
我想在 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]
等等。问题出在哪里?
所以,到现在为止,我想出了问题出在自己身上。不允许在 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;
}
希望对您有所帮助。
我想在 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]
等等。问题出在哪里?
所以,到现在为止,我想出了问题出在自己身上。不允许在 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;
}
希望对您有所帮助。