Der Wert für beide CV_32F
und CV_32FC1
ist 5
(siehe Erläuterung unten), so dass numerisch kein Unterschied besteht.
jedoch:
CV_32F
definiert die Tiefe von jedem Element der Matrix, während
CV_32FC1
sowohl die Tiefe jedes Elements und die Anzahl der Kanäle definiert.
Einige Beispiele ...
Viele Funktionen, z.B. Sobel oder convertTo, erfordern die Zieltiefe (und nicht die Anzahl der Kanäle), so dass Sie tun:
Sobel(src, dst, CV_32F, 1, 0);
src.convertTo(dst, CV_32F);
Aber, wenn eine Matrix zum Beispiel erstellen, müssen Sie auch die Anzahl der Kanäle angeben, so:
Mat m(rows, cols, CV_32FC1);
Grundsätzlich jedes Mal, wenn Sie auch die Anzahl der Kanäle angeben sollten, verwenden CV_32FCx
. Wenn Sie nur die Tiefe benötigen, verwenden CV_32F
CV_32F
ist definiert als:
#define CV_32F 5
während CV_32FC1
ist definiert als:
#define CV_CN_SHIFT 3
#define CV_DEPTH_MAX (1 << CV_CN_SHIFT)
#define CV_MAT_DEPTH_MASK (CV_DEPTH_MAX - 1)
#define CV_MAT_DEPTH(flags) ((flags) & CV_MAT_DEPTH_MASK)
#define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT))
#define CV_32FC1 CV_MAKETYPE(CV_32F,1)
, die 5
auswertet.
Sie können dies mit:
#include <opencv2\opencv.hpp>
#include <iostream>
int main()
{
std::cout << CV_32F << std::endl;
std::cout << CV_32FC1 << std::endl;
return 0;
}
Vielen Dank für diese vollständige Antwort, es ist jetzt klarer :) – mlnthr
Wenn die Antwort Ihr Problem gelöst. Akzeptieren Sie es, indem Sie das grüne Häkchen setzen. – XoXo