私はOpenCV type()
のMat
オブジェクトのメソッドと混同しています。
次の行がある場合:
mat = imread("C:\someimage.jpg");
type = mat.type();
とtype = 16
。マットマトリックスの種類を確認するにはどうすればよいですか。
そのマニュアルや数冊の本で答えを見つけようとしたが無駄だった。
depth()
コードを学ぶことができますtype()
。
私はOpenCV type()
のMat
オブジェクトのメソッドと混同しています。
次の行がある場合:
mat = imread("C:\someimage.jpg");
type = mat.type();
とtype = 16
。マットマトリックスの種類を確認するにはどうすればよいですか。
そのマニュアルや数冊の本で答えを見つけようとしたが無駄だった。
depth()
コードを学ぶことができますtype()
。
回答:
これは、実行時にopencv行列を識別するのに役立つ便利な関数です。少なくともデバッグには役立ちます。
string type2str(int type) {
string r;
uchar depth = type & CV_MAT_DEPTH_MASK;
uchar chans = 1 + (type >> CV_CN_SHIFT);
switch ( depth ) {
case CV_8U: r = "8U"; break;
case CV_8S: r = "8S"; break;
case CV_16U: r = "16U"; break;
case CV_16S: r = "16S"; break;
case CV_32S: r = "32S"; break;
case CV_32F: r = "32F"; break;
case CV_64F: r = "64F"; break;
default: r = "User"; break;
}
r += "C";
r += (chans+'0');
return r;
}
M
タイプの変数の場合、次のMat
ように呼び出すことができます。
string ty = type2str( M.type() );
printf("Matrix: %s %dx%d \n", ty.c_str(), M.cols, M.rows );
次のようなデータを出力します:
Matrix: 8UC3 640x480
Matrix: 64FC1 3x2
MatrixメソッドMat::depth()
ともありMat::channels()
ます。この関数は、ビットがすべて同じ値に格納されている2つの値の組み合わせから人間が読み取れる解釈を取得するための便利な方法です。
depth
とchans
、あなたは、マクロを使用することができますCV_MAT_DEPTH(type)
し、CV_MAT_CN(type)
それぞれ。それらのタイプもである必要がありますint
。これにより、のto_string(chans)
代わりに使用できますchans+'0'
。
デバッガーで生のMat :: typeを検索する場合のデバッグ目的:
+--------+----+----+----+----+------+------+------+------+
| | C1 | C2 | C3 | C4 | C(5) | C(6) | C(7) | C(8) |
+--------+----+----+----+----+------+------+------+------+
| CV_8U | 0 | 8 | 16 | 24 | 32 | 40 | 48 | 56 |
| CV_8S | 1 | 9 | 17 | 25 | 33 | 41 | 49 | 57 |
| CV_16U | 2 | 10 | 18 | 26 | 34 | 42 | 50 | 58 |
| CV_16S | 3 | 11 | 19 | 27 | 35 | 43 | 51 | 59 |
| CV_32S | 4 | 12 | 20 | 28 | 36 | 44 | 52 | 60 |
| CV_32F | 5 | 13 | 21 | 29 | 37 | 45 | 53 | 61 |
| CV_64F | 6 | 14 | 22 | 30 | 38 | 46 | 54 | 62 |
+--------+----+----+----+----+------+------+------+------+
たとえば、type = 30の場合、OpenCVデータ型はCV_64FC4です。type = 50の場合、OpenCVデータ型はCV_16UC(7)です。
OpenCVヘッダー「types_c.h」には、これらを生成する一連の定義があります。形式は次のとおりCV_bits{U|S|F}C<number_of_channels>
です。たとえばCV_8UC3
、8ビットの符号なし文字、3つのカラーチャネルを意味します。これらの名前はそれぞれ、そのファイル内のマクロを使用して任意の整数にマッピングされます。
編集:たとえば、「types_c.h」を参照してください。
#define CV_8UC3 CV_MAKETYPE(CV_8U,3)
#define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT))
eg.
depth = CV_8U = 0
cn = 3
CV_CN_SHIFT = 3
CV_MAT_DEPTH(0) = 0
(((cn)-1) << CV_CN_SHIFT) = (3-1) << 3 = 2<<3 = 16
したがってCV_8UC3 = 16
、この数値を使用することは想定されていませんtype() == CV_8UC3
。内部OpenCV配列のタイプを知る必要があるかどうかを確認してください。
OpenCVはjpegをBGR(または '0'をに渡した場合はグレースケール)に変換することを忘れimread
ないでください。元のファイルについては何も通知されません。
types_c.h
がコアモジュールにあることを知っておくと便利です。たとえば、OpenCVがCドライブのopencv_2.4.11フォルダーに直接インストールされている場合、ヘッダーファイルはC:\ opencv_2.4.11 \ build \ include \ opencv2 \ core \ types_cにあります。 .h
cv::CV_8U
右クリックして選択Go to Definition
し、cv::CV_8U
が定義されているファイルを開くことができますtypes_c.h
。
私はいつも私が取得数れるどのような種類を確認するには、このリンクを使用type()
:
MATタイプのOpenCV OF LIST
私は、これはあなたを助けることができると思います。
デバッグの目的で、@ Octopusによる回答から関数にいくつかの使いやすさを追加しました。
void MatType( Mat inputMat )
{
int inttype = inputMat.type();
string r, a;
uchar depth = inttype & CV_MAT_DEPTH_MASK;
uchar chans = 1 + (inttype >> CV_CN_SHIFT);
switch ( depth ) {
case CV_8U: r = "8U"; a = "Mat.at<uchar>(y,x)"; break;
case CV_8S: r = "8S"; a = "Mat.at<schar>(y,x)"; break;
case CV_16U: r = "16U"; a = "Mat.at<ushort>(y,x)"; break;
case CV_16S: r = "16S"; a = "Mat.at<short>(y,x)"; break;
case CV_32S: r = "32S"; a = "Mat.at<int>(y,x)"; break;
case CV_32F: r = "32F"; a = "Mat.at<float>(y,x)"; break;
case CV_64F: r = "64F"; a = "Mat.at<double>(y,x)"; break;
default: r = "User"; a = "Mat.at<UKNOWN>(y,x)"; break;
}
r += "C";
r += (chans+'0');
cout << "Mat is of type " << r << " and should be accessed with " << a << endl;
}
これは他の何人かによって答えられましたが、私には本当にうまくいく解決策を見つけました。
System.out.println(CvType.typeToString(yourMat));
depth()
とchannels()
、代わりに使用するtype()
データ型とチャンネル数との間の複雑なミックスを返します。