基本思想:使用NCNN的example的生成白色背景的图片,然后在使用下面的代码将图片设置成四通道,且背景为透明颜色;

一、原图如下

二、使用 例子生成纯白色的图片

ncnn代码:ncnn/examples at master · Tencent/ncnn · GitHub

例子中的example/rvm.cpp代码

python代码:GitHub - PeterL1n/RobustVideoMatting: Robust Video Matting in PyTorch, TensorFlow, TensorFlow.js, ONNX, CoreML!

原代码片段

 comp.at<cv::Vec3b>(i, j)[0] = fgr8U.at<cv::Vec3b>(i, j)[0] * alpha + (1 - alpha) * 155;comp.at<cv::Vec3b>(i, j)[1] = fgr8U.at<cv::Vec3b>(i, j)[1] * alpha + (1 - alpha) * 255;comp.at<cv::Vec3b>(i, j)[2] = fgr8U.at<cv::Vec3b>(i, j)[2] * alpha + (1 - alpha) * 120;

修改代码(白色纯背景)

 comp.at<cv::Vec3b>(i, j)[0] = fgr8U.at<cv::Vec3b>(i, j)[0] * alpha + (1 - alpha) * 255;comp.at<cv::Vec3b>(i, j)[1] = fgr8U.at<cv::Vec3b>(i, j)[1] * alpha + (1 - alpha) * 255;comp.at<cv::Vec3b>(i, j)[2] = fgr8U.at<cv::Vec3b>(i, j)[2] * alpha + (1 - alpha) * 255;

代码还需要添加一行代码,否则图片生成和之前的高宽不一样~

 cv::resize(comp, comp,cv::Size(bgr.cols,bgr.rows), 0, 0, cv::INTER_LINEAR);

三、将背景设置成透明色,使用下面的代码处理一下

​
#include<iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include "opencv2/imgproc/types_c.h"
using namespace cv;
using namespace std;void toPng(cv::Mat &src, cv::Mat &dst, int mark)
{cv::Mat cv_input = src.clone();if (cv_input.channels() != 4){cv::cvtColor(cv_input, dst, CV_BGR2BGRA);}else{return;}for (int y = 0; y < dst.rows; ++y){for (int x = 0; x < dst.cols; ++x){cv::Vec4b & pixel = dst.at<cv::Vec4b>(y, x);if ((int)pixel[0] >= mark && (int)pixel[1] >= mark && (int)pixel[2] >=mark){pixel[3] = 0;}}}
}int main()
{Mat dst;Mat grayImage = imread("b.jpg");toPng(grayImage, dst, 255);imwrite("dst.png",dst);return 0;
}​

为啥png图片保存呢?引用

1、jpg是有损压缩格式,png是无损压缩格式。jpg是jpeg的简称,是目前网络上最为流行的图片格式,jpg格式的图片可以将图像文件压缩到最小格式,png全称为Portable Network Graphics,翻译过来就是便携式网络图形,它是一种无损压缩的图片形格式。jpg格式的图片能在高度压缩率的同时,可以展现十分丰富生动的图像,但是随着压缩比的增大,图片的品质会逐渐降低的。而png图片的特性就是体积小,节约空间,与jpg图片相比,png图片是无损压缩,在不损失图片数据的情况下,可以快速的获取自己想要的图片,而且图片的质量并不会下降。
2、jpg图像没有透明的背景,而png图像可以保留透明的背景。
3、png格式的图片可以编辑,但是jpg格式的图片则不可更改。png格式的图片可以编辑,比如图片中的字体,线条等,可以通过ps等软件更改。但是jpg格式的图片则不可更改。png与jpg图片相比png格式的图片更大。
4、png与jpg图片相比,png格式的图片更大。

结果图片

用ps软件看上图更明显  【在线PS软件】在线PS图片(照片)处理工具_在线制作编辑图片ps精简版

ncnn中的example源码 (改了一点点)

#include "ncnn/net.h"
#if defined(USE_NCNN_SIMPLEOCV)
#include "simpleocv.h"
#else
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#endif
#include <stdlib.h>
#include <float.h>
#include <stdio.h>
#include <vector>
#include <opencv2/imgproc/types_c.h>
#include<iostream>
using namespace std;
void toPng(cv::Mat& src, cv::Mat& dst, int mark)
{cv::Mat cv_input = src.clone();if (cv_input.channels() != 4){                    cv::cvtColor(cv_input, dst, CV_BGR2BGRA);}else{return;}for (int y = 0; y < dst.rows; ++y){for (int x = 0; x < dst.cols; ++x){cv::Vec4b& pixel = dst.at<cv::Vec4b>(y, x);// std::cout <<"pixel[0]= "<< pixel[0] << "pixel[1]= " << pixel[1] << "pixel[2]= " << pixel[2] << std::endl;if (pixel[0] == mark && pixel[1] == mark && pixel[2] == mark){pixel[3] = 0;}}}
}static void draw_objects(const cv::Mat& bgr, const cv::Mat& fgr, const cv::Mat& pha)
{cv::Mat fgr8U;fgr.convertTo(fgr8U, CV_8UC3, 255.0, 0);cv::Mat pha8U;pha.convertTo(pha8U, CV_8UC1, 255.0, 0);cv::Mat comp;cv::resize(bgr, comp, pha.size(), 0, 0, 1);for (int i = 0; i < pha8U.rows; i++){for (int j = 0; j < pha8U.cols; j++){uchar data = pha8U.at<uchar>(i, j);float alpha = (float)data / 255;comp.at<cv::Vec3b>(i, j)[0] = fgr8U.at<cv::Vec3b>(i, j)[0] * alpha + (1 - alpha) * 255;//155comp.at<cv::Vec3b>(i, j)[1] = fgr8U.at<cv::Vec3b>(i, j)[1] * alpha + (1 - alpha) * 255;//255comp.at<cv::Vec3b>(i, j)[2] = fgr8U.at<cv::Vec3b>(i, j)[2] * alpha + (1 - alpha) * 255;//120//  std::cout <<(int)comp.at<cv::Vec3b>(i, j)[0] << "  " << (int)comp.at<cv::Vec3b>(i, j)[1] <<"  "<<(int)comp.at<cv::Vec3b>(i, j)[2] << std::endl;}}// cv::imshow("pha", pha8U);//cv::imshow("fgr", fgr8U);//cv::Mat img1_t1(comp, cv::Rect(0, 0, comp.cols, comp.rows));// toPng(comp, img1_t1, 0);// cv::imshow("comp", comp);cv::Mat img_alpha_0;//cv::resize(comp, comp,cv::Size(bgr.cols,bgr.rows), 0, 0, cv::INTER_LINEAR);toPng(comp, img_alpha_0, 255);imwrite("F:\\boost\\b.jpg", img_alpha_0);cv::waitKey(0);
}
static int detect_rvm(const cv::Mat& bgr, cv::Mat& pha, cv::Mat& fgr)
{const float downsample_ratio = 0.5f;const int target_width = 512;const int target_height = 512;ncnn::Net net;net.opt.use_vulkan_compute = false;//original pretrained model from https://github.com/PeterL1n/RobustVideoMatting//ncnn model https://pan.baidu.com/s/11iEY2RGfzWFtce8ue7T3JQ password: d9t6net.load_param("G:\\rvm_ncnn_models\\rvm_512.param");net.load_model("G:\\rvm_ncnn_models\\rvm_512.bin");//if you use another input size,pleaze change input shapencnn::Mat r1i = ncnn::Mat(128, 128, 16);ncnn::Mat r2i = ncnn::Mat(64, 64, 20);ncnn::Mat r3i = ncnn::Mat(32, 32, 40);ncnn::Mat r4i = ncnn::Mat(16, 16, 64);r1i.fill(0.0f);r2i.fill(0.0f);r3i.fill(0.0f);r4i.fill(0.0f);ncnn::Extractor ex = net.create_extractor();const float mean_vals1[3] = { 123.675f, 116.28f, 103.53f };const float norm_vals1[3] = { 0.01712475f, 0.0175f, 0.01742919f };const float mean_vals2[3] = { 0, 0, 0 };const float norm_vals2[3] = { 1 / 255.0, 1 / 255.0, 1 / 255.0 };ncnn::Mat ncnn_in2 = ncnn::Mat::from_pixels_resize(bgr.data, ncnn::Mat::PIXEL_BGR2RGB, bgr.cols, bgr.rows, target_width, target_height);ncnn::Mat ncnn_in1 = ncnn::Mat::from_pixels_resize(bgr.data, ncnn::Mat::PIXEL_BGR2RGB, bgr.cols, bgr.rows, target_width * downsample_ratio, target_height * downsample_ratio);ncnn_in1.substract_mean_normalize(mean_vals1, norm_vals1);ncnn_in2.substract_mean_normalize(mean_vals2, norm_vals2);ex.input("src1", ncnn_in1);ex.input("src2", ncnn_in2);ex.input("r1i", r1i);ex.input("r2i", r2i);ex.input("r3i", r3i);ex.input("r4i", r4i);//if use video matting,these output will be input of next inferex.extract("r4o", r4i);ex.extract("r3o", r3i);ex.extract("r2o", r2i);ex.extract("r1o", r1i);ncnn::Mat pha_;ex.extract("pha", pha_);ncnn::Mat fgr_;ex.extract("fgr", fgr_);cv::Mat cv_pha = cv::Mat(pha_.h, pha_.w, CV_32FC1, (float*)pha_.data);cv::Mat cv_fgr = cv::Mat(fgr_.h, fgr_.w, CV_32FC3);float* fgr_data = (float*)fgr_.data;for (int i = 0; i < fgr_.h; i++){for (int j = 0; j < fgr_.w; j++){cv_fgr.at<cv::Vec3f>(i, j)[2] = fgr_data[0 * fgr_.h * fgr_.w + i * fgr_.w + j];cv_fgr.at<cv::Vec3f>(i, j)[1] = fgr_data[1 * fgr_.h * fgr_.w + i * fgr_.w + j];cv_fgr.at<cv::Vec3f>(i, j)[0] = fgr_data[2 * fgr_.h * fgr_.w + i * fgr_.w + j];}}cv_pha.copyTo(pha);cv_fgr.copyTo(fgr);return 0;
}
int main(int argc, char** argv)
{cv::Mat m = cv::imread("F:\\boost\\a.jpg");if (m.empty()){return -1;}cv::Mat fgr, pha;detect_rvm(m, pha, fgr);draw_objects(m, fgr, pha);return 0;
}

23、使用OpenCV和NCNN进行人物抠图并将背景设置成透明色相关推荐

  1. 怎样抠图怎么把背景换成白色?几个步骤教你轻松掌握

    有时候我们一些照片背景色比较杂乱需要想要换成纯色,或者一些证件照需要更换白色底该怎么操作呢?相信一些制作简历,或者从事电商图片制作的小伙伴可能都遇到过这种问题,但是很多在线处理的小网页也不敢上传图片怕 ...

  2. opencv中的美图技巧(祛斑,词云,风格迁移,抠图,插图,修改背景,图片二维码)等着你的女朋友夸你吧

    个人ps 没掌握得怎么好,尝试用程序来完成ps的功能吧. 有斑点怎么办:祛斑. 只有一张城市白天图,像生成黑夜图怎么办,用风格迁移把. 人物抠图就不说啦吧. 没钱带女友旅游世界怎么办,我教你修改你背景 ...

  3. oracle替换图片颜色,PS人物抠图、衣服颜色更换及相片增加清晰度方法

    在日常生活中,我们往往会拍摄很多漂亮的照片,但也有不足之处.下面的教程主要为大家讲解一下人物抠图.衣服颜色更换及相片增加清晰度的方法.教程很全面,也很不错,推荐过来,大家一起来学习吧! 方法/步骤 1 ...

  4. java抠图人物背景图片_如何进行人物抠图?让你快速完成复杂背景人像的在线抠图...

    大多数男生心目中都有一个女神,虽然在其他人眼中不过是普通人,但是在自己眼中她怎么看怎么有魅力.当然对于女神提出的各种各样的"要求"或是请求,你们定然是不会轻易拒绝的.但若是女神需要 ...

  5. java抠图人物背景图片_人物抠图换背景两种实用方法!

    人物抠图在平面设计中是非常常见的,那么到底要如何将图片素材中的人物抠出来,换到新的背景中呢?其中都有哪些要点?下面小编分享给大家两种实用的人物抠图方法,会使用到两种不同的图片编辑软件. 一.PS抠图 ...

  6. 揭秘阿里巴巴神奇的人物抠图算法内幕

    (欢迎关注"我爱计算机视觉"公众号,一个有价值有深度的公众号~) 电商环境中,商品的图片展示比文字展示对顾客购买有更直观的吸引力,尤其在购买衣服时.阿里巴巴的百万卖家各个都是ps大 ...

  7. 人物抠图换背景怎么做?教你几种抠图方法轻松抠出人物

    怎么把图片中的人像抠出来换背景呢?在现代社会,照片已经成为人们生活的常见元素,而照片的后期处理也越来越受到人们的关注.当人们拍摄一张照片时,常常会想要将人像从背景中抠出来,以便更好地突出主题.此时,将 ...

  8. 怎么把人物抠图到另一个背景上?这几种抠图方法很实用

    怎么把人物抠图放到另一个背景上呢?抠出人物图像可以轻松地将人物放入不同的背景中,从而创造出更加丰富的视觉效果.通过更改背景,可以改变照片的整体氛围,带来不同的感受和体验.也能更好地突出人物本身,使其更 ...

  9. 如何人物抠图?介绍三种人物抠图的方法

    如何将照片里的人物从照片里抠出来呢?在广告制作. 社交媒体.商品展示.影视制作等场景下,需要将产品图片与人物图片进行组合,这时就需要将人物从原始图片中抠出来,然后放置到广告背景中.今天来介绍三种方法, ...

最新文章

  1. 零基础的前端开发初学者应如何系统地学习?
  2. 上下文菜单Context Menu
  3. Shell-8--数值运算及处理
  4. 如何撰写较受欢迎的技术文章
  5. KICAD | 分享一个必须安装的插件Interactive HTML BOM plugin for KiCad
  6. 7-1 图形卡片排序游戏 (40 分)
  7. 深入理解javascript作用域系列第三篇
  8. SpringBoot系列: 与Spring Rest服务交互数据
  9. 再来过-docker
  10. 4S店卖不出去的库存车都是怎么处理的?
  11. VassistX番茄助手使用技巧
  12. 【渝粤教育】电大中专计算机常用工具软件 (2)_1作业 题库
  13. win10命令行快捷键
  14. kali最高权限root
  15. JAVA博雅楼自习室预约系统计算机毕业设计Mybatis+系统+数据库+调试部署
  16. 基于单片机的智能台灯设计
  17. 将公式图片转word公式
  18. css制作聊天气泡android,css实现聊天气泡效果
  19. Git-用 cherry-pick 挑好看的小樱桃
  20. Python之OpenGL笔记(17):键盘鼠标控制摄像机移动旋转

热门文章

  1. elasticsearch7.6 词频统计
  2. 开源: CVPR 2020 修复你的老照片
  3. APP开发者必备,主流安卓应用商店开发者公司账号注册
  4. 使用windows自带的测速工具WinSat对移动硬盘进行测速
  5. Ubuntu安装Burg
  6. java五子棋的重要算法讲解_[Java五子棋小游戏-Ai算法精讲以及实现]-02--高级算法初步...
  7. oracle HTTP Server安装和配置为集群代理(linux)
  8. 将一个3*3的矩阵转置,用一个实现。在主函数中用scanf函数输入以下矩阵元素
  9. Linux perf 1.4、hardware events
  10. 阿里云mysql用户名和密码是什么_阿里云服务器数据库账号密码是什么