OpenCV Version 3.2.0Was sind die verschiedenen Möglichkeiten, cv :: Mat zu konstruieren?
Ich lese Bradski und versuche, verschiedene cv :: Mat Konstruktoren - Einzelkanal. Kann mir bitte jemand sagen, warum die Konstruktoren nicht funktionieren?
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);
Die entsprechenden Antworten sind:
[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
Und dann die entsprechenden Antworten für lena.jpg die beschnittene Version von Reichweite und Rect ist. Ich weiß nicht, wie man die Bereiche benutzt.
'mat3' und' mat6' scheinen nicht in Ordnung zu sein. Zumindest OpenCV 3.x [benötigt] (https://github.com/opencv/opencv/blob/master/modules/core/include/opencv2/core/mat.inl.hpp#L512) die Schrittgröße um sein mindestens die Länge einer Zeile (dh keine Überlappung ist erlaubt). –
@ DanMašek Es funktioniert. Das Ergebnis ist in der Antwort. sizeof (float) schreitet um ein Element im Quell-Array fort. Es muss nicht die Größe von (Zeile) sein – infoclogged
[That bestätigen] (https://github.com/opencv/opencv/blob/2.2/modules/core/include/opencv2/core/mat.hpp#L141) hat war dort mindestens seit OpenCV 2.2. Da es ein 'CV_DbgAssert' ist, wird es natürlich nur im Debug-Modus ausgelöst, und im Release-Modus wird es" funktionieren ". Aber etwas, das im Debug-Modus abstürzt und brennt, würde ich nicht als funktionierend bezeichnen. –