Path: blob/master/modules/gapi/test/own/mat_tests.cpp
16339 views
// This file is part of OpenCV project.1// It is subject to the license terms in the LICENSE file found in the top-level directory2// of this distribution and at http://opencv.org/license.html.3//4// Copyright (C) 2018 Intel Corporation567#include "test_precomp.hpp"8#include "opencv2/gapi/own/mat.hpp"9#include <opencv2/gapi/util/compiler_hints.hpp> //suppress_unused_warning1011namespace opencv_test12{13using Mat = cv::gapi::own::Mat;1415TEST(OwnMat, DefaultConstruction)16{17Mat m;18ASSERT_EQ(m.data, nullptr);19ASSERT_EQ(m.cols, 0);20ASSERT_EQ(m.rows, 0);21ASSERT_EQ(m.cols, 0);22ASSERT_EQ(m.type(), 0);23ASSERT_EQ(m.depth(), 0);24}2526TEST(OwnMat, Create)27{28auto size = cv::gapi::own::Size{32,16};29Mat m;30m.create(size, CV_8UC1);3132ASSERT_NE(m.data, nullptr);33ASSERT_EQ((cv::gapi::own::Size{m.cols, m.rows}), size);3435ASSERT_EQ(m.total(), static_cast<size_t>(size.height*size.width));36ASSERT_EQ(m.type(), CV_8UC1);37ASSERT_EQ(m.depth(), CV_8U);38ASSERT_EQ(m.channels(), 1);39ASSERT_EQ(m.elemSize(), sizeof(uint8_t));40ASSERT_EQ(m.step, sizeof(uint8_t) * m.cols);41}4243TEST(OwnMat, CreateOverload)44{45auto size = cv::gapi::own::Size{32,16};46Mat m;47m.create(size.height,size.width, CV_8UC1);4849ASSERT_NE(m.data, nullptr);50ASSERT_EQ((cv::Size{m.cols, m.rows}), size);5152ASSERT_EQ(m.total(), static_cast<size_t>(size.height*size.width));53ASSERT_EQ(m.type(), CV_8UC1);54ASSERT_EQ(m.depth(), CV_8U);55ASSERT_EQ(m.channels(), 1);56ASSERT_EQ(m.elemSize(), sizeof(uint8_t));57ASSERT_EQ(m.step, sizeof(uint8_t) * m.cols);58}59TEST(OwnMat, Create3chan)60{61auto size = cv::Size{32,16};62Mat m;63m.create(size, CV_8UC3);6465ASSERT_NE(m.data, nullptr);66ASSERT_EQ((cv::Size{m.cols, m.rows}), size);6768ASSERT_EQ(m.type(), CV_8UC3);69ASSERT_EQ(m.depth(), CV_8U);70ASSERT_EQ(m.channels(), 3);71ASSERT_EQ(m.elemSize(), 3 * sizeof(uint8_t));72ASSERT_EQ(m.step, 3* sizeof(uint8_t) * m.cols);73}7475struct NonEmptyMat {76cv::gapi::own::Size size{32,16};77Mat m;78NonEmptyMat() {79m.create(size, CV_8UC1);80}81};8283struct OwnMatSharedSemantics : NonEmptyMat, ::testing::Test {};848586namespace {87auto state_of = [](Mat const& mat) {88return std::make_tuple(89mat.data,90cv::Size{mat.cols, mat.rows},91mat.type(),92mat.depth(),93mat.channels()94);95};9697void ensure_mats_are_same(Mat const& copy, Mat const& m){98EXPECT_NE(copy.data, nullptr);99EXPECT_EQ(state_of(copy), state_of(m));100}101}102TEST_F(OwnMatSharedSemantics, CopyConstruction)103{104Mat copy(m);105ensure_mats_are_same(copy, m);106}107108TEST_F(OwnMatSharedSemantics, CopyAssignment)109{110Mat copy;111copy = m;112ensure_mats_are_same(copy, m);113}114115struct OwnMatMoveSemantics : NonEmptyMat, ::testing::Test {116Mat& moved_from = m;117decltype(state_of(moved_from)) initial_state = state_of(moved_from);118119void ensure_state_moved_to(Mat const& moved_to)120{121EXPECT_EQ(state_of(moved_to), initial_state);122EXPECT_EQ(state_of(moved_from), state_of(Mat{}));123}124};125126TEST_F(OwnMatMoveSemantics, MoveConstruction)127{128Mat moved_to(std::move(moved_from));129130ensure_state_moved_to(moved_to);131}132133TEST_F(OwnMatMoveSemantics, MoveAssignment)134{135Mat moved_to(std::move(moved_from));136ensure_state_moved_to(moved_to);137}138139struct OwnMatNonOwningView : NonEmptyMat, ::testing::Test {140decltype(state_of(m)) initial_state = state_of(m);141142void TearDown() override {143EXPECT_EQ(state_of(m), initial_state)<<"State of the source matrix changed?";144//ASAN should complain here if memory is freed here (e.g. by bug in non owning logic of own::Mat)145volatile uchar dummy = m.data[0];146cv::util::suppress_unused_warning(dummy);147}148149};150151TEST_F(OwnMatNonOwningView, Construction)152{153Mat non_owning_view(m.rows, m.cols, m.type(), static_cast<void*>(m.data));154155ensure_mats_are_same(non_owning_view, m);156}157158TEST_F(OwnMatNonOwningView, CopyConstruction)159{160Mat non_owning_view{m.rows, m.cols, m.type(), static_cast<void*>(m.data)};161162Mat non_owning_view_copy = non_owning_view;163ensure_mats_are_same(non_owning_view_copy, m);164}165166TEST_F(OwnMatNonOwningView, Assignment)167{168Mat non_owning_view{m.rows, m.cols, m.type(), static_cast<void*>(m.data)};169Mat non_owning_view_copy;170171non_owning_view_copy = non_owning_view;172ensure_mats_are_same(non_owning_view_copy, m);173}174175TEST(OwnMatConversion, WithStep)176{177constexpr int width = 8;178constexpr int height = 8;179constexpr int stepInPixels = 16;180181std::array<int, height * stepInPixels> data;182for (size_t i = 0; i < data.size(); i++)183{184data[i] = static_cast<int>(i);185}186cv::Mat cvMat(cv::Size{width, height}, CV_32S, data.data(), stepInPixels * sizeof(int));187188auto ownMat = to_own(cvMat);189auto cvMatFromOwn = cv::gapi::own::to_ocv(ownMat);190191EXPECT_EQ(0, cv::countNonZero(cvMat != cvMatFromOwn))192<< cvMat << std::endl193<< (cvMat != cvMatFromOwn);194}195196TEST(OwnMat, PtrWithStep)197{198constexpr int width = 8;199constexpr int height = 8;200constexpr int stepInPixels = 16;201202std::array<int, height * stepInPixels> data;203for (size_t i = 0; i < data.size(); i++)204{205data[i] = static_cast<int>(i);206}207Mat mat(height, width, CV_32S, data.data(), stepInPixels * sizeof(int));208209EXPECT_EQ(& data[0], reinterpret_cast<int*>(mat.ptr(0)));210EXPECT_EQ(& data[1], reinterpret_cast<int*>(mat.ptr(0, 1)));211EXPECT_EQ(& data[stepInPixels], reinterpret_cast<int*>(mat.ptr(1)));212EXPECT_EQ(& data[stepInPixels +1], reinterpret_cast<int*>(mat.ptr(1,1)));213214auto const& cmat = mat;215216EXPECT_EQ(& data[0], reinterpret_cast<const int*>(cmat.ptr(0)));217EXPECT_EQ(& data[1], reinterpret_cast<const int*>(cmat.ptr(0, 1)));218EXPECT_EQ(& data[stepInPixels], reinterpret_cast<const int*>(cmat.ptr(1)));219EXPECT_EQ(& data[stepInPixels +1], reinterpret_cast<const int*>(cmat.ptr(1,1)));220}221222TEST(OwnMat, CopyToWithStep)223{224constexpr int width = 8;225constexpr int height = 8;226constexpr int stepInPixels = 16;227228std::array<int, height * stepInPixels> data;229for (size_t i = 0; i < data.size(); i++)230{231data[i] = static_cast<int>(i);232}233Mat mat(height, width, CV_32S, data.data(), stepInPixels * sizeof(int));234235Mat dst;236mat.copyTo(dst);237238EXPECT_NE(mat.data, dst.data);239EXPECT_EQ(0, cv::countNonZero(to_ocv(mat) != to_ocv(dst)))240<< to_ocv(mat) << std::endl241<< (to_ocv(mat) != to_ocv(dst));242}243244TEST(OwnMat, ScalarAssign32SC1)245{246constexpr int width = 8;247constexpr int height = 8;248constexpr int stepInPixels = 16;249250std::array<int, height * stepInPixels> data;251for (size_t i = 0; i < data.size(); i++)252{253data[i] = static_cast<int>(i);254}255Mat mat(height, width, CV_32S, data.data(), stepInPixels * sizeof(data[0]));256257mat = cv::gapi::own::Scalar{-1};258259std::array<int, height * stepInPixels> expected;260261for (size_t row = 0; row < height; row++)262{263for (size_t col = 0; col < stepInPixels; col++)264{265auto index = row*stepInPixels + col;266expected[index] = col < width ? -1 : static_cast<int>(index);267}268}269270auto cmp_result_mat = (cv::Mat{height, stepInPixels, CV_32S, data.data()} != cv::Mat{height, stepInPixels, CV_32S, expected.data()});271EXPECT_EQ(0, cv::countNonZero(cmp_result_mat))272<< cmp_result_mat << std::endl;273}274275TEST(OwnMat, ScalarAssign8UC1)276{277constexpr int width = 8;278constexpr int height = 8;279constexpr int stepInPixels = 16;280281std::array<uchar, height * stepInPixels> data;282for (size_t i = 0; i < data.size(); i++)283{284data[i] = static_cast<uchar>(i);285}286Mat mat(height, width, CV_8U, data.data(), stepInPixels * sizeof(data[0]));287288mat = cv::gapi::own::Scalar{-1};289290std::array<uchar, height * stepInPixels> expected;291292for (size_t row = 0; row < height; row++)293{294for (size_t col = 0; col < stepInPixels; col++)295{296auto index = row*stepInPixels + col;297expected[index] = col < width ? cv::saturate_cast<uchar>(-1) : static_cast<uchar>(index);298}299}300301auto cmp_result_mat = (cv::Mat{height, stepInPixels, CV_8U, data.data()} != cv::Mat{height, stepInPixels, CV_8U, expected.data()});302EXPECT_EQ(0, cv::countNonZero(cmp_result_mat))303<< cmp_result_mat << std::endl;304}305306TEST(OwnMat, ScalarAssign8UC3)307{308constexpr auto cv_type = CV_8SC3;309constexpr int channels = 3;310constexpr int width = 8;311constexpr int height = 8;312constexpr int stepInPixels = 16;313314std::array<schar, height * stepInPixels * channels> data;315for (size_t i = 0; i < data.size(); i+= channels)316{317data[i + 0] = static_cast<schar>(10 * i + 0);318data[i + 1] = static_cast<schar>(10 * i + 1);319data[i + 2] = static_cast<schar>(10 * i + 2);320}321322Mat mat(height, width, cv_type, data.data(), channels * stepInPixels * sizeof(data[0]));323324mat = cv::gapi::own::Scalar{-10, -11, -12};325326std::array<schar, data.size()> expected;327328for (size_t row = 0; row < height; row++)329{330for (size_t col = 0; col < stepInPixels; col++)331{332int index = static_cast<int>(channels * (row*stepInPixels + col));333expected[index + 0] = static_cast<schar>(col < width ? -10 : 10 * index + 0);334expected[index + 1] = static_cast<schar>(col < width ? -11 : 10 * index + 1);335expected[index + 2] = static_cast<schar>(col < width ? -12 : 10 * index + 2);336}337}338339auto cmp_result_mat = (cv::Mat{height, stepInPixels, cv_type, data.data()} != cv::Mat{height, stepInPixels, cv_type, expected.data()});340EXPECT_EQ(0, cv::countNonZero(cmp_result_mat))341<< cmp_result_mat << std::endl342<< "data : " << std::endl343<< cv::Mat{height, stepInPixels, cv_type, data.data()} << std::endl344<< "expected : " << std::endl345<< cv::Mat{height, stepInPixels, cv_type, expected.data()} << std::endl;346}347348TEST(OwnMat, ROIView)349{350constexpr int width = 8;351constexpr int height = 8;352constexpr int stepInPixels = 16;353354std::array<uchar, height * stepInPixels> data;355for (size_t i = 0; i < data.size(); i++)356{357data[i] = static_cast<uchar>(i);358}359360361// std::cout<<cv::Mat{height, stepInPixels, CV_8U, data.data()}<<std::endl;362363std::array<uchar, 4 * 4> expected;364365for (size_t row = 0; row < 4; row++)366{367for (size_t col = 0; col < 4; col++)368{369expected[row*4 +col] = static_cast<uchar>(stepInPixels * (2 + row) + 2 + col);370}371}372373Mat mat(height, width, CV_8U, data.data(), stepInPixels * sizeof(data[0]));374Mat roi_view (mat, cv::gapi::own::Rect{2,2,4,4});375376// std::cout<<cv::Mat{4, 4, CV_8U, expected.data()}<<std::endl;377//378auto expected_cv_mat = cv::Mat{4, 4, CV_8U, expected.data()};379380auto cmp_result_mat = (to_ocv(roi_view) != expected_cv_mat);381EXPECT_EQ(0, cv::countNonZero(cmp_result_mat))382<< cmp_result_mat << std::endl383<< to_ocv(roi_view) << std::endl384<< expected_cv_mat << std::endl;385}386} // namespace opencv_test387388389