1

CapiとC++apiを使用してSobelをテストしました。しかし、なぜそれが違うのですか?私が使用したすべてのパラメーターは同じです。

CAPIを使用するSobel出力-CAPIを使用

C++APIを使用するSobel出力-C++APIを使用

編集済み

C API:

/// Generate grad_x
grad_x = cvCreateImage(cvGetSize(grayImg), IPL_DEPTH_16S, 1);
abs_grad_x = cvCreateImage(cvGetSize(grayImg), 8, 1);

/// Gradient X
cvSobel(grayImg, grad_x, 1, 0, 3);
cvConvertScaleAbs(grad_x, abs_grad_x);
cvThreshold(abs_grad_x, abs_grad_x, 0, 255, CV_THRESH_BINARY|CV_THRESH_OTSU);

C ++ API:

cv::Mat img_sobel;
cv::Sobel(img_gray, img_sobel, CV_8U, 1, 0, 3, 1, 0, BORDER_DEFAULT);

Mat img_threshold;
threshold(img_sobel, img_threshold, 0, 255, CV_THRESH_OTSU+CV_THRESH_BINARY);
4

2 に答える 2

3

結果が異なる理由は1つだけです。データ・タイプ!

Cバージョンでは、深みのある作成grad_xを行っています。IPL_DEPTH_16Sしたがって、各ピクセルにはshortデータ型があります。これにより、関数を呼び出したときに得られる結果の精度が向上しcvSobelます。cvSobel結果のより広い範囲の値(-32768〜32767)に対応​​できますgrad_x

C ++バージョンでは、マトリックスを初期化し、宛先タイプを指定していませんCV_8U。この関数cv::Sobelは、タイプCV_8Uの宛先マトリックスを内部的に作成し、結果を計算してから、宛先データタイプの範囲(0〜255)にクランプします。したがって、すべての負の値は0になります。

Cバージョンで同じ結果を得るには、をに変更IPL_DEPTH_16SIPL_DEPTH_8Uます。

于 2013-01-15T19:42:49.897 に答える
0

C++コードの最後の行をから
threshold(img_sobel, img_threshold, 0, 255, CV_THRESH_OTSU+CV_THRESH_BINARY);
に変更します
threshold(img_sobel, img_threshold, 0, 255, CV_THRESH_OTSU | CV_THRESH_BINARY);

于 2013-01-15T17:55:04.050 に答える