#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/dnn/dnn.hpp>
void LiteNet(cv::Mat& cv_src, cv::Mat& cv_dst, cv::dnn::Net& net)
{
cv::Size reso(512, 512);
cv::Mat blob = cv::dnn::blobFromImage(cv_src, 1.0 / 255, reso,
cv::Scalar(0.485, 0.456, 0.406), true, false);
net.setInput(blob);
cv::Mat out = net.forward();
cv::Mat segm = cv::Mat::zeros(out.size[2], out.size[3], CV_8UC1);
for (int i = 0; i < out.size[2] * out.size[3]; ++i)
{
if (out.ptr<float>(0, 0)[i] < out.ptr<float>(0, 1)[i])
{
segm.data[i] = 255;
}
}
cv::resize(segm, cv_dst, cv_src.size(), 0.0, 0.0, cv::INTER_NEAREST);
}
void imshow(std::string name, const cv::Mat& img)
{
cv::namedWindow(name, 0);
int max_rows = 500;
int max_cols = 600;
if (img.rows >= img.cols && img.rows > max_rows) {
cv::resizeWindow(name, cv::Size(img.cols * max_rows / img.rows, max_rows));
}
else if (img.cols >= img.rows && img.cols > max_cols) {
cv::resizeWindow(name, cv::Size(max_cols, img.rows * max_cols / img.cols));
}
cv::imshow(name, img);
}
int main()
{
std::string net_path = "models/LiteSeg-512.onnx";
cv::dnn::Net net = cv::dnn::readNet(net_path);
std::string path = "images";
std::vector<std::string> filenames;
cv::glob(path, filenames, false);
for (auto name : filenames)
{
cv::Mat cv_src = cv::imread(name);
auto t0 = cv::getTickCount();
cv::Mat cv_dst;
LiteNet(cv_src, cv_dst, net);
auto t1 = cv::getTickCount();
std::cout << "elapsed time: " << (t1 - t0) * 1000.0 / cv::getTickFrequency() << "ms" << std::endl;
imshow("src", cv_src);
imshow("dst", cv_dst);
cv::waitKey();
}
return 0;
}
LiteSeg语义分割 C++ 模型部署
版权申诉
5星 · 超过95%的资源 162 浏览量
2022-05-02
15:16:08
上传
评论 1
收藏 25.94MB RAR 举报
知来者逆
- 粉丝: 4w+
- 资源: 82
- 1
- 2
- 3
前往页