1 // This file is part of OpenCV project.
2 // It is subject to the license terms in the LICENSE file found in the top-level directory
3 // of this distribution and at http://opencv.org/license.html.
5 // Copyright (C) 2018-2019 Intel Corporation
8 #include "test_precomp.hpp"
9 #include "opencv2/gapi/own/mat.hpp"
10 #include <opencv2/gapi/util/compiler_hints.hpp> //suppress_unused_warning
14 using Mat = cv::gapi::own::Mat;
16 TEST(OwnMat, DefaultConstruction)
19 ASSERT_EQ(m.data, nullptr);
23 ASSERT_EQ(m.type(), 0);
24 ASSERT_EQ(m.depth(), 0);
29 auto size = cv::gapi::own::Size{32,16};
31 m.create(size, CV_8UC1);
33 ASSERT_NE(m.data, nullptr);
34 ASSERT_EQ((cv::gapi::own::Size{m.cols, m.rows}), size);
36 ASSERT_EQ(m.total(), static_cast<size_t>(size.height*size.width));
37 ASSERT_EQ(m.type(), CV_8UC1);
38 ASSERT_EQ(m.depth(), CV_8U);
39 ASSERT_EQ(m.channels(), 1);
40 ASSERT_EQ(m.elemSize(), sizeof(uint8_t));
41 ASSERT_EQ(m.step, sizeof(uint8_t) * m.cols);
44 TEST(OwnMat, CreateOverload)
46 auto size = cv::gapi::own::Size{32,16};
48 m.create(size.height,size.width, CV_8UC1);
50 ASSERT_NE(m.data, nullptr);
51 ASSERT_EQ((cv::Size{m.cols, m.rows}), size);
53 ASSERT_EQ(m.total(), static_cast<size_t>(size.height*size.width));
54 ASSERT_EQ(m.type(), CV_8UC1);
55 ASSERT_EQ(m.depth(), CV_8U);
56 ASSERT_EQ(m.channels(), 1);
57 ASSERT_EQ(m.elemSize(), sizeof(uint8_t));
58 ASSERT_EQ(m.step, sizeof(uint8_t) * m.cols);
60 TEST(OwnMat, Create3chan)
62 auto size = cv::Size{32,16};
64 m.create(size, CV_8UC3);
66 ASSERT_NE(m.data, nullptr);
67 ASSERT_EQ((cv::Size{m.cols, m.rows}), size);
69 ASSERT_EQ(m.type(), CV_8UC3);
70 ASSERT_EQ(m.depth(), CV_8U);
71 ASSERT_EQ(m.channels(), 3);
72 ASSERT_EQ(m.elemSize(), 3 * sizeof(uint8_t));
73 ASSERT_EQ(m.step, 3* sizeof(uint8_t) * m.cols);
77 cv::gapi::own::Size size{32,16};
80 m.create(size, CV_8UC1);
84 struct OwnMatSharedSemantics : NonEmptyMat, ::testing::Test {};
88 auto state_of = [](Mat const& mat) {
89 return std::make_tuple(
91 cv::Size{mat.cols, mat.rows},
98 void ensure_mats_are_same(Mat const& copy, Mat const& m){
99 EXPECT_NE(copy.data, nullptr);
100 EXPECT_EQ(state_of(copy), state_of(m));
103 TEST_F(OwnMatSharedSemantics, CopyConstruction)
106 ensure_mats_are_same(copy, m);
109 TEST_F(OwnMatSharedSemantics, CopyAssignment)
113 ensure_mats_are_same(copy, m);
116 struct OwnMatMoveSemantics : NonEmptyMat, ::testing::Test {
118 decltype(state_of(moved_from)) initial_state = state_of(moved_from);
120 void ensure_state_moved_to(Mat const& moved_to)
122 EXPECT_EQ(state_of(moved_to), initial_state);
123 EXPECT_EQ(state_of(moved_from), state_of(Mat{}));
127 TEST_F(OwnMatMoveSemantics, MoveConstruction)
129 Mat moved_to(std::move(moved_from));
131 ensure_state_moved_to(moved_to);
134 TEST_F(OwnMatMoveSemantics, MoveAssignment)
136 Mat moved_to(std::move(moved_from));
137 ensure_state_moved_to(moved_to);
140 struct OwnMatNonOwningView : NonEmptyMat, ::testing::Test {
141 decltype(state_of(m)) initial_state = state_of(m);
143 void TearDown() override {
144 EXPECT_EQ(state_of(m), initial_state)<<"State of the source matrix changed?";
145 //ASAN should complain here if memory is freed here (e.g. by bug in non owning logic of own::Mat)
146 volatile uchar dummy = m.data[0];
147 cv::util::suppress_unused_warning(dummy);
152 TEST_F(OwnMatNonOwningView, Construction)
154 Mat non_owning_view(m.rows, m.cols, m.type(), static_cast<void*>(m.data));
156 ensure_mats_are_same(non_owning_view, m);
159 TEST_F(OwnMatNonOwningView, CopyConstruction)
161 Mat non_owning_view{m.rows, m.cols, m.type(), static_cast<void*>(m.data)};
163 Mat non_owning_view_copy = non_owning_view;
164 ensure_mats_are_same(non_owning_view_copy, m);
167 TEST_F(OwnMatNonOwningView, Assignment)
169 Mat non_owning_view{m.rows, m.cols, m.type(), static_cast<void*>(m.data)};
170 Mat non_owning_view_copy;
172 non_owning_view_copy = non_owning_view;
173 ensure_mats_are_same(non_owning_view_copy, m);
176 TEST(OwnMatConversion, WithStep)
178 constexpr int width = 8;
179 constexpr int height = 8;
180 constexpr int stepInPixels = 16;
182 std::array<int, height * stepInPixels> data;
183 for (size_t i = 0; i < data.size(); i++)
185 data[i] = static_cast<int>(i);
187 cv::Mat cvMat(cv::Size{width, height}, CV_32S, data.data(), stepInPixels * sizeof(int));
189 auto ownMat = to_own(cvMat);
190 auto cvMatFromOwn = cv::gapi::own::to_ocv(ownMat);
192 EXPECT_EQ(0, cv::countNonZero(cvMat != cvMatFromOwn))
193 << cvMat << std::endl
194 << (cvMat != cvMatFromOwn);
197 TEST(OwnMat, PtrWithStep)
199 constexpr int width = 8;
200 constexpr int height = 8;
201 constexpr int stepInPixels = 16;
203 std::array<int, height * stepInPixels> data;
204 for (size_t i = 0; i < data.size(); i++)
206 data[i] = static_cast<int>(i);
208 Mat mat(height, width, CV_32S, data.data(), stepInPixels * sizeof(int));
210 EXPECT_EQ(& data[0], reinterpret_cast<int*>(mat.ptr(0)));
211 EXPECT_EQ(& data[1], reinterpret_cast<int*>(mat.ptr(0, 1)));
212 EXPECT_EQ(& data[stepInPixels], reinterpret_cast<int*>(mat.ptr(1)));
213 EXPECT_EQ(& data[stepInPixels +1], reinterpret_cast<int*>(mat.ptr(1,1)));
215 auto const& cmat = mat;
217 EXPECT_EQ(& data[0], reinterpret_cast<const int*>(cmat.ptr(0)));
218 EXPECT_EQ(& data[1], reinterpret_cast<const int*>(cmat.ptr(0, 1)));
219 EXPECT_EQ(& data[stepInPixels], reinterpret_cast<const int*>(cmat.ptr(1)));
220 EXPECT_EQ(& data[stepInPixels +1], reinterpret_cast<const int*>(cmat.ptr(1,1)));
223 TEST(OwnMat, CopyToWithStep)
225 constexpr int width = 8;
226 constexpr int height = 8;
227 constexpr int stepInPixels = 16;
229 std::array<int, height * stepInPixels> data;
230 for (size_t i = 0; i < data.size(); i++)
232 data[i] = static_cast<int>(i);
234 Mat mat(height, width, CV_32S, data.data(), stepInPixels * sizeof(int));
239 EXPECT_NE(mat.data, dst.data);
240 EXPECT_EQ(0, cv::countNonZero(to_ocv(mat) != to_ocv(dst)))
241 << to_ocv(mat) << std::endl
242 << (to_ocv(mat) != to_ocv(dst));
245 TEST(OwnMat, ScalarAssign32SC1)
247 constexpr int width = 8;
248 constexpr int height = 8;
249 constexpr int stepInPixels = 16;
251 std::array<int, height * stepInPixels> data;
252 for (size_t i = 0; i < data.size(); i++)
254 data[i] = static_cast<int>(i);
256 Mat mat(height, width, CV_32S, data.data(), stepInPixels * sizeof(data[0]));
258 mat = cv::gapi::own::Scalar{-1};
260 std::array<int, height * stepInPixels> expected;
262 for (size_t row = 0; row < height; row++)
264 for (size_t col = 0; col < stepInPixels; col++)
266 auto index = row*stepInPixels + col;
267 expected[index] = col < width ? -1 : static_cast<int>(index);
271 auto cmp_result_mat = (cv::Mat{height, stepInPixels, CV_32S, data.data()} != cv::Mat{height, stepInPixels, CV_32S, expected.data()});
272 EXPECT_EQ(0, cv::countNonZero(cmp_result_mat))
273 << cmp_result_mat << std::endl;
276 TEST(OwnMat, ScalarAssign8UC1)
278 constexpr int width = 8;
279 constexpr int height = 8;
280 constexpr int stepInPixels = 16;
282 std::array<uchar, height * stepInPixels> data;
283 for (size_t i = 0; i < data.size(); i++)
285 data[i] = static_cast<uchar>(i);
287 Mat mat(height, width, CV_8U, data.data(), stepInPixels * sizeof(data[0]));
289 mat = cv::gapi::own::Scalar{-1};
291 std::array<uchar, height * stepInPixels> expected;
293 for (size_t row = 0; row < height; row++)
295 for (size_t col = 0; col < stepInPixels; col++)
297 auto index = row*stepInPixels + col;
298 expected[index] = col < width ? cv::saturate_cast<uchar>(-1) : static_cast<uchar>(index);
302 auto cmp_result_mat = (cv::Mat{height, stepInPixels, CV_8U, data.data()} != cv::Mat{height, stepInPixels, CV_8U, expected.data()});
303 EXPECT_EQ(0, cv::countNonZero(cmp_result_mat))
304 << cmp_result_mat << std::endl;
307 TEST(OwnMat, ScalarAssign8UC3)
309 constexpr auto cv_type = CV_8SC3;
310 constexpr int channels = 3;
311 constexpr int width = 8;
312 constexpr int height = 8;
313 constexpr int stepInPixels = 16;
315 std::array<schar, height * stepInPixels * channels> data;
316 for (size_t i = 0; i < data.size(); i+= channels)
318 data[i + 0] = static_cast<schar>(10 * i + 0);
319 data[i + 1] = static_cast<schar>(10 * i + 1);
320 data[i + 2] = static_cast<schar>(10 * i + 2);
323 Mat mat(height, width, cv_type, data.data(), channels * stepInPixels * sizeof(data[0]));
325 mat = cv::gapi::own::Scalar{-10, -11, -12};
327 std::array<schar, data.size()> expected;
329 for (size_t row = 0; row < height; row++)
331 for (size_t col = 0; col < stepInPixels; col++)
333 int index = static_cast<int>(channels * (row*stepInPixels + col));
334 expected[index + 0] = static_cast<schar>(col < width ? -10 : 10 * index + 0);
335 expected[index + 1] = static_cast<schar>(col < width ? -11 : 10 * index + 1);
336 expected[index + 2] = static_cast<schar>(col < width ? -12 : 10 * index + 2);
340 auto cmp_result_mat = (cv::Mat{height, stepInPixels, cv_type, data.data()} != cv::Mat{height, stepInPixels, cv_type, expected.data()});
341 EXPECT_EQ(0, cv::countNonZero(cmp_result_mat))
342 << cmp_result_mat << std::endl
343 << "data : " << std::endl
344 << cv::Mat{height, stepInPixels, cv_type, data.data()} << std::endl
345 << "expected : " << std::endl
346 << cv::Mat{height, stepInPixels, cv_type, expected.data()} << std::endl;
349 TEST(OwnMat, ROIView)
351 constexpr int width = 8;
352 constexpr int height = 8;
353 constexpr int stepInPixels = 16;
355 std::array<uchar, height * stepInPixels> data;
356 for (size_t i = 0; i < data.size(); i++)
358 data[i] = static_cast<uchar>(i);
362 // std::cout<<cv::Mat{height, stepInPixels, CV_8U, data.data()}<<std::endl;
364 std::array<uchar, 4 * 4> expected;
366 for (size_t row = 0; row < 4; row++)
368 for (size_t col = 0; col < 4; col++)
370 expected[row*4 +col] = static_cast<uchar>(stepInPixels * (2 + row) + 2 + col);
374 Mat mat(height, width, CV_8U, data.data(), stepInPixels * sizeof(data[0]));
375 Mat roi_view (mat, cv::gapi::own::Rect{2,2,4,4});
377 // std::cout<<cv::Mat{4, 4, CV_8U, expected.data()}<<std::endl;
379 auto expected_cv_mat = cv::Mat{4, 4, CV_8U, expected.data()};
381 auto cmp_result_mat = (to_ocv(roi_view) != expected_cv_mat);
382 EXPECT_EQ(0, cv::countNonZero(cmp_result_mat))
383 << cmp_result_mat << std::endl
384 << to_ocv(roi_view) << std::endl
385 << expected_cv_mat << std::endl;
387 } // namespace opencv_test