OpenCV Version 3.2.0cv :: Matを構築するさまざまな方法は何ですか?
私はBradskiを読んでいて、別のcv :: Matコンストラクタを作成しようとしています。 コンストラクタが動作しない理由を教えてもらえますか?
float data1[6] = {1,2,3,4,5,6};
float data2[6] = {10,20,30,40,50,60};
float data3[6] = {100,200,300,400,500,600};
cv::Mat mat1(3,4,CV_32FC1); //OK
cv::Mat mat2(3,4,CV_32FC1,cv::Scalar(33.3)); //OK
cv::Mat mat3(3,4,CV_32FC1,data1,sizeof(float)); //OK
cv::Mat mat4(cv::Size(3,4),CV_32FC1); //OK
cv::Mat mat5(cv::Size(3,4),CV_32FC1,cv::Scalar(66.6)); //OK
cv::Mat mat6(cv::Size(3,4),CV_32FC1,data2,sizeof(float)); //OK
int sz[] = {8, 8, 8};
cv::Mat bigCube1(3, sz, CV_32FC1); // OK
cv::Mat bigCube2(3, sz, CV_32FC1, cv::Scalar::all(99)); // OK
cv::Mat bigCube3(3, sz, CV_32FC1, data3, 4); // Not OK, How to initialise a 3D from data?
std::cout << mat1 << std::endl << mat2 << std::endl << mat3 << std::endl << mat4 << std::endl << mat5 << std::endl << mat6 << std::endl; // OK
std::cout << bigCube1.at<float>(10,10,10) << std::endl << bigCube2.at<float>(10,10,10) << std::endl; // OK
cv::Mat img_rgb = cv::imread("lena.jpg", CV_LOAD_IMAGE_COLOR);
std::vector<cv::Range> ranges(3, cv::Range(2,3));
cv::Mat roiRange(img_rgb, cv::Range(100, 300), cv::Range(0, 512)); //OK
cv::Mat roiRect(img_rgb, cv::Rect(0,100,512,200)); // OK
cv::Mat roiRangeMultiple(bigCube1, ranges); // OK
cv::namedWindow("range", CV_WINDOW_AUTOSIZE);
imshow("range", roiRange); // OK
cv::namedWindow("rect", CV_WINDOW_AUTOSIZE);
imshow("rect", roiRect); // OK
std::cout << roiRangeMultiple.at<float>(0,1,1); // Not OK. Expecting a float value as answer
cv::waitKey(0);
対応の答えは以下のとおりです。lena.jpgため
[4.6634629e-10, 0, 0, 0;
0, 0, 0, 0;
127.62516, 2.8025969e-45, 0, 0]
[33.299999, 33.299999, 33.299999, 33.299999;
33.299999, 33.299999, 33.299999, 33.299999;
33.299999, 33.299999, 33.299999, 33.299999]
[1, 2, 3, 4;
2, 3, 4, 5;
3, 4, 5, 6]
[0, 0, 0;
0, 0, 0;
0, 0, 0;
0, 0, 0]
[66.599998, 66.599998, 66.599998;
66.599998, 66.599998, 66.599998;
66.599998, 66.599998, 66.599998;
66.599998, 66.599998, 66.599998]
[10, 20, 30;
20, 30, 40;
30, 40, 50;
40, 50, 60]
0 // bigCube1
99 // bigCube2
してから、対応する答えが範囲とのRectからトリミングされたバージョンです。私は範囲を使用する方法を知っていない。
'mat3'と' mat6'はOKではないようです。 OpenCV 3.x以上で必要なステップサイズ(https://github.com/opencv/opencv/blob/master/modules/core/include/opencv2/core/mat.inl.hpp#L512)少なくとも行の長さ(つまり、重複は許されません)。 –
@DanMašekそれは動作します。結果は答えです。 sizeof(float)ステップをソース配列内の1つの要素で置き換えます。それはsizeof(行)である必要はありません – infoclogged
[そのアサート](https://github.com/opencv/opencv/blob/2.2/modules/core/include/opencv2/core/mat.hpp#L141)が持っています少なくともOpenCV 2.2以降であった。もちろん、CV_DbgAssertであるため、デバッグモードでのみ起動し、リリースモードでは動作します。しかし、デバッグモードでクラッシュして焼けるものは、私が働いているとは言いません。 –