1

OpenCV 2.4.0 python バインディングを使用していますが、画像のラプラシアンを計算すると、cv2.cv API とは異なる結果が得られることがわかりました。

cv2 API を使用する場合:

im_laplacian = cv2.Laplacian(im_gray, cv2.IPL_DEPTH_32F, ksize = 3)

im_laplacian は常に uint8 (符号なし) であり、ddepth は IPL_DEPTH_32F または IPL_DEPTH_64F である必要があります。

「OverflowError: Python int が大きすぎて C long に変換できません」

cv2.cv API を使用する場合:

cvgray = cv.fromarray(im_gray)
im_laplacian2 = cv.CreateImage(cv.GetSize(cvgray), cv.IPL_DEPTH_16S, 1)        
cv.Laplace(cvgray, im_laplacian2, 3)

予想通り、符号付きラプラシアンが得られました。これは C++ API と同じ結果です。私が行った場合:

im_laplacian2_scaled = cv.CreateImage(cv.GetSize(cvgray), 8, 1) 
cv.ConvertScaleAbs(dst, im_laplacian2_scaled, 1, 0)

im_laplacian2_scaled は、cv2 API で計算された im_laplacian とはまだ異なります

私の特定のケースでは、cv2 出力を回避できると思いますが、困惑しています。すべての API が同じ出力を生成するべきではありませんか? 彼らは異なるアルゴリズムを使用していますか?それとも、cv2 python バインディングは個々の C++ 関数に対応していませんが、それらの組み合わせに対応していますか?

4

1 に答える 1

3

新しいcv2API は異なる深度定数を使用します。

  • cv2.CV_64Fそれ以外のcv2.IPL_DEPTH_64F
  • cv2.CV_32Fそれ以外のcv2.IPL_DEPTH_32F
  • cv2.CV_32Sそれ以外のcv2.IPL_DEPTH_32S
  • cv2.CV_16Sそれ以外のcv2.IPL_DEPTH_16S
  • cv2.CV_16Uそれ以外のcv2.IPL_DEPTH_16U
  • cv2.CV_8Sそれ以外のcv2.IPL_DEPTH_8S
  • cv2.CV_8Uそれ以外のcv2.IPL_DEPTH_8U
于 2012-07-04T15:41:48.547 に答える