ハンマーの答えは非常に明確であり、それはあなたに素晴らしいヒントを示しています:常にデータ型をチェックし、気をつけてください、types_c.h
あなたが望むたびにそれをチェックしてください!
とにかく、minMaxLocはdoubleを返しますが、すでにキャストを行っています。uchar Matオブジェクトを入力配列として指定すると、2つのdouble変数が0〜255の範囲(uchar範囲!)のdoubleとして設定されます。
この例を参照してください。
#include <opencv2/core/core.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int /*argc*/, char** /*argv*/) {
double m, M;
Point p_min, p_max;
Mat img;
// let's do with uchar Mat
img = (Mat_<uchar>(3,3) << 0,1,2,3,4,5,6,7,255);
cout << img << endl;
minMaxLoc(img, &m, &M, &p_min, &p_max);
cout << "min: " << m << " at " << p_min << endl;
cout << "max: " << M << " at " << p_max << endl;
cout << (int)img.at<uchar>(p_max.y, p_max.x) << endl; // cast to int otherwise cout will print an ASCII (uchar)
// now with float Mat
img = (Mat_<float>(3,3) << 0.1f,1.2f,2,3000.2f,4,5,6,7,255);
cout << img << endl;
minMaxLoc(img, &m, &M, &p_min, &p_max);
cout << "min: " << m << " at " << p_min << endl;
cout << "max: " << M << " at " << p_max << endl;
cout << img.at<float>(p_max.y, p_max.x) << endl;
return 0;
}
ここで、投稿したコードで、宛先タイプをで定義しますddepth
。ddepth
次のように、opencv定数データ型として指定できます。
ddepth = CV_8UC1
この場合、cv::Laplacianはucharマットを返します。
したがって、処理しているデータの種類に常に注意してください。カラー画像を使用している場合は、おそらく使用したほうがよいでしょうMat::at<Scalar>()
。