1

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]

等々。問題はどこですか?

4

1 に答える 1

1

それで、今では、私は自分自身が何に問題があるのか​​ を理解しました。cvtColor() 関数と Laplacian() 関数で同じ変数を 2 回使用することはできません。つまり、ソースと宛先を同じにすることはできません。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;
}

それが役に立てば幸い。

于 2020-03-25T17:56:53.627 に答える