Files
2026-07-13 13:33:03 +08:00

140 lines
5.0 KiB
C++

//
// draw_test.cpp
// MNN
//
// Created by MNN on 2021/08/26.
// Copyright © 2018, Alibaba Group Holding Limited
//
#include <gtest/gtest.h>
#include <opencv2/imgproc/imgproc.hpp>
#include "cv/imgcodecs.hpp"
#include "test_env.hpp"
#ifdef MNN_DRAW_TEST
static Env<uint8_t> testEnv(img_name, false);
// arrowedLine
TEST(arrowedLine, basic) {
cv::arrowedLine(testEnv.cvSrc, {10, 10}, {300, 200}, {0, 0, 255}, 1);
arrowedLine(testEnv.mnnSrc, {10, 10}, {300, 200}, {0, 0, 255}, 1);
EXPECT_TRUE(testEnv.equal(testEnv.cvSrc, testEnv.mnnSrc));
}
TEST(arrowedLine, thickness) {
cv::arrowedLine(testEnv.cvSrc, {10, 10}, {30, 20}, {0, 0, 255}, 5);
arrowedLine(testEnv.mnnSrc, {10, 10}, {30, 20}, {0, 0, 255}, 5);
EXPECT_TRUE(testEnv.equal(testEnv.cvSrc, testEnv.mnnSrc));
}
// circle
TEST(circle, basic) {
cv::circle(testEnv.cvSrc, {50, 50}, 10, {0, 0, 255}, 1);
circle(testEnv.mnnSrc, {50, 50}, 10, {0, 0, 255}, 1);
EXPECT_TRUE(testEnv.equal(testEnv.cvSrc, testEnv.mnnSrc));
}
TEST(circle, thickness) {
cv::circle(testEnv.cvSrc, {100, 100}, 10, {0, 0, 255}, 5);
circle(testEnv.mnnSrc, {100, 100}, 10, {0, 0, 255}, 5);
EXPECT_TRUE(testEnv.equal(testEnv.cvSrc, testEnv.mnnSrc));
}
TEST(circle, fill) {
cv::circle(testEnv.cvSrc, {150, 150}, 10, {0, 0, 255}, -1);
circle(testEnv.mnnSrc, {150, 150}, 10, {0, 0, 255}, -1);
EXPECT_TRUE(testEnv.equal(testEnv.cvSrc, testEnv.mnnSrc));
}
// ellipse
TEST(ellipse, basic) {
cv::ellipse(testEnv.cvSrc, {50, 50}, {20, 30}, 0, 0, 360, {10, 120, 230}, 1);
ellipse(testEnv.mnnSrc, {50, 50}, {20, 30}, 0, 0, 360, {10, 120, 230}, 1);
EXPECT_TRUE(testEnv.equal(testEnv.cvSrc, testEnv.mnnSrc));
}
TEST(ellipse, thickness) {
cv::ellipse(testEnv.cvSrc, {100, 100}, {30, 50}, 0, 0, 360, {1, 128, 255}, 5);
ellipse(testEnv.mnnSrc, {100, 100}, {30, 50}, 0, 0, 360, {1, 128, 255}, 5);
EXPECT_TRUE(testEnv.equal(testEnv.cvSrc, testEnv.mnnSrc));
}
TEST(ellipse, fill) {
cv::ellipse(testEnv.cvSrc, {150, 150}, {40, 70}, 0, 0, 360, {10, 20, 30}, -1);
ellipse(testEnv.mnnSrc, {150, 150}, {40, 70}, 0, 0, 360, {10, 20, 30}, -1);
EXPECT_TRUE(testEnv.equal(testEnv.cvSrc, testEnv.mnnSrc));
}
// line
TEST(line, basic) {
// cv::line(testEnv.cvSrc, {10, 10}, {200, 300}, {0, 0, 255}, 1);
// line(testEnv.mnnSrc, {10, 10}, {200, 300}, {0, 0, 255}, 1);
cv::line(testEnv.cvSrc, {10, 10}, {50, 50}, {0, 0, 255}, 1);
line(testEnv.mnnSrc, {10, 10}, {50, 50}, {0, 0, 255}, 1);
EXPECT_TRUE(testEnv.equal(testEnv.cvSrc, testEnv.mnnSrc));
}
TEST(line, thickness) {
cv::line(testEnv.cvSrc, {10, 10}, {20, 20}, {0, 0, 255}, 5);
line(testEnv.mnnSrc, {10, 10}, {20, 20}, {0, 0, 255}, 5);
// cv::imwrite("cv_line.jpg", testEnv.cvSrc);
// imwrite("mnn_line.jpg", testEnv.mnnSrc);
EXPECT_TRUE(testEnv.equal(testEnv.cvSrc, testEnv.mnnSrc));
}
// rectangle
TEST(rectangle, basic) {
cv::rectangle(testEnv.cvSrc, {10, 10}, {200, 300}, {0, 0, 255}, 1);
rectangle(testEnv.mnnSrc, {10, 10}, {200, 300}, {0, 0, 255}, 1);
EXPECT_TRUE(testEnv.equal(testEnv.cvSrc, testEnv.mnnSrc));
}
TEST(rectangle, fill) {
cv::rectangle(testEnv.cvSrc, {10, 10}, {200, 300}, {200, 20, 2}, -1);
rectangle(testEnv.mnnSrc, {10, 10}, {200, 300}, {200, 20, 2}, -1);
EXPECT_TRUE(testEnv.equal(testEnv.cvSrc, testEnv.mnnSrc));
}
// drawContours
TEST(drawContours, basic) {
cv::Mat gray, binary;
cv::cvtColor(testEnv.cvSrc, gray, cv::COLOR_BGR2GRAY);
cv::threshold(gray, binary, 127, 255, cv::THRESH_BINARY);
std::vector<std::vector<cv::Point>> cv_contours;
std::vector<cv::Vec4i> hierarchy;
cv::findContours(binary, cv_contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
cv::drawContours(testEnv.cvSrc, cv_contours, -1, {0, 0, 255}, -1);
std::vector<std::vector<Point>> mnn_contours(cv_contours.size());
for (int i = 0; i < cv_contours.size(); i++) {
for (int j = 0; j < cv_contours[i].size(); j++) {
Point p;
p.set(cv_contours[i][j].x, cv_contours[i][j].y);
mnn_contours[i].push_back(p);
}
}
drawContours(testEnv.mnnSrc, mnn_contours, -1, {0, 0, 255}, -1);
EXPECT_TRUE(testEnv.equal(testEnv.cvSrc, testEnv.mnnSrc));
}
TEST(fillPoly, basic) {
cv::Mat gray, binary;
cv::cvtColor(testEnv.cvSrc, gray, cv::COLOR_BGR2GRAY);
cv::threshold(gray, binary, 127, 255, cv::THRESH_BINARY);
std::vector<std::vector<cv::Point>> cv_contours;
std::vector<cv::Vec4i> hierarchy;
cv::findContours(binary, cv_contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
cv::fillPoly(testEnv.cvSrc, cv_contours, {0, 0, 255});
std::vector<std::vector<Point>> mnn_contours(cv_contours.size());
for (int i = 0; i < cv_contours.size(); i++) {
for (int j = 0; j < cv_contours[i].size(); j++) {
Point p;
p.set(cv_contours[i][j].x, cv_contours[i][j].y);
mnn_contours[i].push_back(p);
}
}
fillPoly(testEnv.mnnSrc, mnn_contours, {0, 0, 255});
EXPECT_TRUE(testEnv.equal(testEnv.cvSrc, testEnv.mnnSrc));
}
#endif