首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >uniapp中实现h5扫码功能(优化版)

uniapp中实现h5扫码功能(优化版)

作者头像
taixingyiji
发布于 2022-09-21 12:53:34
发布于 2022-09-21 12:53:34
3.5K00
代码可运行
举报
运行总次数:0
代码可运行

# uniapp中实现h5扫码功能(优化版)

前言

原本是使用uniapp开发微信小程序,扫码功能非常好实现。

但是由于业务原因,需要将小程序转换成H5的方式,发现 uni.scanCode 方法不好用了。

网上查询多个解决方案,但是由于我们的二维码过于复杂。

最终决定使用微信的扫一扫功能,通过js-sdk方式进行调用扫码功能。

扫码主要流程为:

  1. 首先需要通过微信打开H5页面。
  2. 进入扫码页面,扫码页面加载完成时,前端向服务端请求config信息。
  3. 服务端收到信息后,首先获取accessToken,然后通过accessToken换取js-sdk的ticket。(此处的accessToken和ticket可以存入系统缓存中,默认7200秒后超时)
  4. 服务端通过ticket和一些参数配置,生成前端所需信息,返回给前端页面。
  5. 前端页面完成加载。
  6. 点击扫码按钮,进行微信扫一扫的调用,就可以进行扫码了。

#一、前期准备

  1. 使用此方法前,需要拥有一个公众号为主体。
  2. 获取公众号的appIdappSecret,不懂如何获取的请自行百度。
  1. 需要将线上服务器的IP和你开发测试环境的IP,填写到IP白名单中,否则无法调用。
  2. 需要将线上服务器的域名,添加到JS接口安全域名

#二、服务端开发

#1. 抽象appId和appSecret到yml文件中。

此处可以自行通过其他方式实现,仅供参考。

  • yml文件内容
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
weixin:
  app-id: xxxxx
  app-secret: xxxxx

  • 配置类,用于装载yaml文件内容
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "weixin")
@Data
public class WeixinConfig {
    private String appId;
    private String appSecret;
}


  • 自动装载类,用于在springboot启动时,自动将yaml文件内容装载到bean中。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableConfigurationProperties(WeixinConfig.class)
@AutoConfigureAfter(WeixinConfig.class)
public class WeixinConfiguration {
}

#2. 编写微信工具类(获取accessToken和ticket)

  • 获取accessToken
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public String getAccessToken() {
        // 从redis获取token
        String token = (String) redisUtil.get(RedisConstant.WEIXIN + RedisConstant.ACCESS_TOKEN);
        // 若redis为空,则需要从微信处获取token
        if (StringUtils.isEmpty(token)) {
            String requestUrl = ACCESS_TOKEN_URL.replace("APPID", weixinConfig.getAppId()).replace("SECRET", weixinConfig.getAppSecret());
            String response = HttpUtil.get(requestUrl);
            JSONObject jsonObject = JSONUtil.parseObj(response);
            // 判断微信返回结果是否异常
            if (StringUtils.isEmpty(jsonObject.get(ERRCODE)) || Integer.parseInt(String.valueOf(jsonObject.get(ERRCODE))) == 0) {
                // 持久化到redis中
                redisUtil.set(RedisConstant.WEIXIN + RedisConstant.ACCESS_TOKEN, jsonObject.getStr(ACCESS_TOKEN), 7000);
                return jsonObject.getStr(ACCESS_TOKEN);
            } else {
                logger.error(jsonObject.toStringPretty());
                throw new ServiceException("获取公众号token信息异常");
            }
        } else {
            return token;
        }
    }

  • 通过accessToken获取Ticket
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public String jsapiTicket() {
        // 从redis获取ticket
        String ticket = (String) redisUtil.get(RedisConstant.WEIXIN + RedisConstant.JS_TICKET);
        // 若为空,则从微信服务器获取
        if (StringUtils.isEmpty(ticket)) {
            String accessToken = getAccessToken();
            String requestUrl = ACCESS_TICKET_URL.replace("ACCESS_TOKEN", accessToken);
            String response = HttpUtil.get(requestUrl);
            JSONObject jsonObject = JSONUtil.parseObj(response);
            // 判断微信返回结果是否异常
            if (StringUtils.isEmpty(jsonObject.get(ERRCODE)) || Integer.parseInt(String.valueOf(jsonObject.get(ERRCODE))) == 0) {
                // 持久化到redis中
                redisUtil.set(RedisConstant.WEIXIN + RedisConstant.JS_TICKET, jsonObject.getStr(TICKET), 7000);
                return jsonObject.getStr(TICKET);
            } else {
                logger.error(jsonObject.toStringPretty());
                throw new ServiceException("获取公众号ticket信息异常");
            }
        }
        return ticket;
    }

  • SHA1方法
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public static String SHA1(String decript) {
        try {
            MessageDigest digest = java.security.MessageDigest.getInstance("SHA-1");
            digest.update(decript.getBytes());
            byte messageDigest[] = digest.digest();
            // Create Hex String
            StringBuffer hexString = new StringBuffer();
            // 字节数组转换为 十六进制 数
            for (int i = 0; i < messageDigest.length; i++) {
                String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
                if (shaHex.length() < 2) {
                    hexString.append(0);
                }
                hexString.append(shaHex);
            }
            return hexString.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return "";
    }

  • 完整代码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.hcframe.base.common.ServiceException;
import com.hcframe.redis.RedisUtil;
import com.repchain.nfr.common.config.RedisConstant;
import com.repchain.nfr.common.config.WeixinConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;


@Component
public class WeixinUtil {

    final WeixinConfig weixinConfig;
    final RedisUtil redisUtil;
    private final Logger logger = LoggerFactory.getLogger(WeixinUtil.class);
    public final static String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=SECRET";
    public final static String ACCESS_TICKET_URL = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";
    public final static String ERRCODE = "errcode";
    public final static String ACCESS_TOKEN = "access_token";
    public final static String TICKET = "ticket";

    public WeixinUtil(WeixinConfig weixinConfig,
                      RedisUtil redisUtil) {
        this.weixinConfig = weixinConfig;
        this.redisUtil = redisUtil;
    }

    /**
     * @return java.lang.String
     * @author lhc
     * @description // 获取微信accessToken
     * @date 2022/8/11 10:29
     * @params []
     **/
    public String getAccessToken() {
        // 从redis获取token
        String token = (String) redisUtil.get(RedisConstant.WEIXIN + RedisConstant.ACCESS_TOKEN);
        // 若redis为空,则需要从微信处获取token
        if (StringUtils.isEmpty(token)) {
            String requestUrl = ACCESS_TOKEN_URL.replace("APPID", weixinConfig.getAppId()).replace("SECRET", weixinConfig.getAppSecret());
            String response = HttpUtil.get(requestUrl);
            JSONObject jsonObject = JSONUtil.parseObj(response);
            // 判断微信返回结果是否异常
            if (StringUtils.isEmpty(jsonObject.get(ERRCODE)) || Integer.parseInt(String.valueOf(jsonObject.get(ERRCODE))) == 0) {
                // 持久化到redis中
                redisUtil.set(RedisConstant.WEIXIN + RedisConstant.ACCESS_TOKEN, jsonObject.getStr(ACCESS_TOKEN), 7000);
                return jsonObject.getStr(ACCESS_TOKEN);
            } else {
                logger.error(jsonObject.toStringPretty());
                throw new ServiceException("获取公众号token信息异常");
            }
        } else {
            return token;
        }
    }

    /**
     * @return cn.hutool.json.JSONObject
     * @author lhc
     * @description // 获取微信jssdk授权
     * @date 2022/8/11 10:30
     * @params []
     **/
    public String jsapiTicket() {
        // 从redis获取ticket
        String ticket = (String) redisUtil.get(RedisConstant.WEIXIN + RedisConstant.JS_TICKET);
        // 若为空,则从微信服务器获取
        if (StringUtils.isEmpty(ticket)) {
            String accessToken = getAccessToken();
            String requestUrl = ACCESS_TICKET_URL.replace("ACCESS_TOKEN", accessToken);
            String response = HttpUtil.get(requestUrl);
            JSONObject jsonObject = JSONUtil.parseObj(response);
            // 判断微信返回结果是否异常
            if (StringUtils.isEmpty(jsonObject.get(ERRCODE)) || Integer.parseInt(String.valueOf(jsonObject.get(ERRCODE))) == 0) {
                // 持久化到redis中
                redisUtil.set(RedisConstant.WEIXIN + RedisConstant.JS_TICKET, jsonObject.getStr(TICKET), 7000);
                return jsonObject.getStr(TICKET);
            } else {
                logger.error(jsonObject.toStringPretty());
                throw new ServiceException("获取公众号ticket信息异常");
            }
        }
        return ticket;
    }

    public static String SHA1(String decript) {
        try {
            MessageDigest digest = java.security.MessageDigest.getInstance("SHA-1");
            digest.update(decript.getBytes());
            byte messageDigest[] = digest.digest();
            // Create Hex String
            StringBuffer hexString = new StringBuffer();
            // 字节数组转换为 十六进制 数
            for (int i = 0; i < messageDigest.length; i++) {
                String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
                if (shaHex.length() < 2) {
                    hexString.append(0);
                }
                hexString.append(shaHex);
            }
            return hexString.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return "";
    }
}

#3. 服务端接口

  • controller接口
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RestController
@RequestMapping("/weixintest")
public class WeixinController {

    final WeixinService weixinService;

    public WeixinController(WeixinService weixinService) {
        this.weixinService = weixinService;
    }

    @GetMapping("jssdktest")
    public ResultVO<Object> getJsSdkInfo(String url) {
        return weixinService.getJsSdkInfo(url);
    }
}

  • service实现类,通过微信工具类,构建前端所需要的参数。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.hcframe.base.common.ResultVO;
import com.repchain.nfr.common.config.WeixinConfig;
import com.repchain.nfr.common.utils.WeixinUtil;
import com.repchain.nfr.module.weixin.service.WeixinService;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;


@Service
public class WeixinServiceImpl implements WeixinService {

    final WeixinUtil weixinUtil;
    final WeixinConfig weixinConfig;

    public WeixinServiceImpl(WeixinUtil weixinUtil,WeixinConfig weixinConfig) {
        this.weixinUtil = weixinUtil;
        this.weixinConfig = weixinConfig;
    }
    @Override
    public ResultVO<Object> getJsSdkInfo(String url) {
        if (StringUtils.isEmpty(url)) {
            url = weixinConfig.getJsUrl();
        }
        String ticket = weixinUtil.jsapiTicket();
        // 随机字符串
        String noncestr = UUID.randomUUID().toString().replaceAll("-", "");
        // 时间戳
        String timestamp = String.valueOf(System.currentTimeMillis());
        String str = "jsapi_ticket="+ticket+"&noncestr="+noncestr+"&timestamp="+timestamp+"&url="+url;
        // SHA1签名字符串
        String signature = WeixinUtil.SHA1(str);
        // 返回前端结果
        Map<String,String> map=new HashMap<>(5);
        map.put("timestamp",timestamp);
        map.put("appId",this.weixinConfig.getAppId());
        map.put("noncestr",noncestr);
        map.put("signature",signature);
        return ResultVO.getSuccess(map);
    }
}

#三、H5前端开发

#1. 添加微信js-sdk依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yarn add weixin-js-sdk

#2. 获取后台的Request

此处可以自行实现,主要目的就是从服务端拉去数据。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { $get } from "@/common/http";

export const getJsSdkInfo = (url: string) =>
  $get(`/weixintest/jssdktest`, { url }, true);

#3. 加载页面后初始化wx.config内容(此处需要放到onLoad中执行)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
getConfig() {
  	// 此处为域名
    const url = "https://xxxx.xxx.com/";
  	// 通过服务端获取所需信息
    getJsSdkInfo(url)
      .then(res => {
        this.configInfo = res.data;
        this.wxConfig(
          res.data.appId,
          res.data.timestamp,
          res.data.noncestr,
          res.data.signature
        );
      })
      .catch(() => {
        uni.hideLoading();
        uni.showToast({
          title: "请稍后再试",
          icon: "error"
        });
      });
  }

// 微信的js-sdk初始化
wxConfig(appId: any, timestamp: any, nonceStr: any, signature: any) {
    wx.config({
      debug: false, // 开启调试模式,
      appId: appId, // 必填,企业号的唯一标识
      timestamp: timestamp, // 必填,生成签名的时间戳
      nonceStr: nonceStr, // 必填,生成签名的随机串
      signature: signature, // 必填,签名
      jsApiList: ["scanQRCode", "checkJsApi"] // 必填,需要使用的JS接口列表
    });
    wx.ready(() => {
      uni.hideLoading();
    });
    wx.error(function (res: any) {
      console.log(res);
      uni.hideLoading();
      uni.showToast({
        title: "请使用微信打开,或稍后再试",
        icon: "error"
      });
    });
  }

#4. 调用微信扫码功能

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 scanClick() {
    // eslint-disable-next-line @typescript-eslint/no-this-alias
    const that = this;
    wx.scanQRCode({
      needResult: 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
      scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是一维码,默认二者都有
      success: function (res: any) {
        console.log(res.resultStr); //返回结果
      },
      fail: function () {
        uni.showToast({
          title: "识别二维码失败!",
          duration: 2000,
          icon: "none"
        });
      }
    });
 }

#5. 完整代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <view>
    <view class="auth-icon-bind">
      <view>
        <u-icon name="scan" size="200" color="#50416f"></u-icon>
      </view>
    </view>
    <view class="bind-title">
      <uni-title
        type="h1"
        title="请扫描二维码绑定藏品"
        align="center"
        color="#50416f"
      ></uni-title>
    </view>
    <view class="auth-button">
      <button class="btn-logout" @click="scanClick">点击扫描二维码</button>
    </view>
  </view>
</template>
<script lang="ts">
import { Component, Vue } from "vue-property-decorator";
import Setting from "@/settings";
import Settings from "@/settings";
import wx from "weixin-js-sdk";
import { getJsSdkInfo } from "@/api/wxApi";
import { isInWeixin } from "@/utils/agent";
import { router } from "@/router/router";

@Component({
  name: "BlockList",
  components: { hcPass }
})
export default class extends Vue {
  theme = Setting.theme;
  showBindView = false;
  tranJson = "";
  result = "";
  error = "";

  onLoad() {
    uni.showLoading({ title: "加载中" });
  }

  getConfig() {
    const url = "https://scicollection.las.ac.cn/";
    getJsSdkInfo(url)
      .then(res => {
        this.configInfo = res.data;
        this.wxConfig(
          res.data.appId,
          res.data.timestamp,
          res.data.noncestr,
          res.data.signature
        );
      })
      .catch(() => {
        uni.hideLoading();
        uni.showToast({
          title: "请稍后再试",
          icon: "error"
        });
      });
  }

  wxConfig(appId: any, timestamp: any, nonceStr: any, signature: any) {
    wx.config({
      debug: false, // 开启调试模式,
      appId: appId, // 必填,企业号的唯一标识
      timestamp: timestamp, // 必填,生成签名的时间戳
      nonceStr: nonceStr, // 必填,生成签名的随机串
      signature: signature, // 必填,签名
      jsApiList: ["scanQRCode", "checkJsApi"] // 必填,需要使用的JS接口列表
    });
    wx.ready(() => {
      uni.hideLoading();
    });
    wx.error(function (res: any) {
      console.log(res);
      uni.hideLoading();
      uni.showToast({
        title: "请使用微信打开,或稍后再试",
        icon: "error"
      });
    });
  }

  onShow() {
    // 判断是否为微信环境
    if (isInWeixin()) {
      this.getConfig();
    } else {
      uni.hideLoading();
      uni.showModal({
        title: "提示",
        content: "请在微信中打开网站,使用扫一扫功能",
        confirmColor: Settings.theme,
        success: function () {
          router.pushTab("/xxxx");
        }
      });
    }
  }

  scanClick() {
    // eslint-disable-next-line @typescript-eslint/no-this-alias
    const that = this;
    wx.scanQRCode({
      needResult: 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
      scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是一维码,默认二者都有
      success: function (res: any) {
      	console.log(res.resultStr); //返回结果
      },
      fail: function () {
        uni.showToast({
          title: "识别二维码失败!",
          duration: 2000,
          icon: "none"
        });
      }
    });
  }
}
</script>

#参考内容

https://blog.csdn.net/qq_40230848/article/details/123003012

https://blog.csdn.net/acitylion/article/details/108981375?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-108981375-blog-124504330.pc_relevant_multi_platform_whitelistv3&spm=1001.2101.3001.4242.2&utm_relevant_index=4

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
Hi,您好呀,您近期内容创作表现突出,已入选腾讯云开发者社区内容共创官计划。内容共创官计划是腾讯云开发者社区面向社区重点潜力创作者打造的内容创作扶持机制,提供一系列技术创作教程、独家有奖创作激励、活动优先参会、社区流量曝光等资源。请您添加社区助理微信(微信号:yun_assistant)沟通加入计划。
Hi,您好呀,您近期内容创作表现突出,已入选腾讯云开发者社区内容共创官计划。内容共创官计划是腾讯云开发者社区面向社区重点潜力创作者打造的内容创作扶持机制,提供一系列技术创作教程、独家有奖创作激励、活动优先参会、社区流量曝光等资源。请您添加社区助理微信(微信号:yun_assistant)沟通加入计划。
回复回复1举报
推荐阅读
增强无界 3D 高斯扫描与视图一致的 2D 扩散优先级,3DGS-Enhancer在NVS增强中的先进效果 !
新视角合成(NVS)在计算机视觉和图形学领域有着数十年的历史,旨在从多个输入图像或视频中生成场景的视角。最近,三维高斯分裂(3DGS)[18]在生成具有高效渲染管线的照片级渲染方面表现出色。然而,在远离现有视角渲染高质量的新视角仍然具有很大的挑战性,这在稀疏视图设置中经常遇到,因为低采样区域的信息不足。如图1所示,当只有三个输入视图时,会出现明显的椭球形和空洞状的伪影。由于实际中存在这些低质量的渲染结果,因此有必要增强3DGS,以确保其在实际应用中的可行性。
AIGC 先锋科技
2024/11/21
3810
增强无界 3D 高斯扫描与视图一致的 2D 扩散优先级,3DGS-Enhancer在NVS增强中的先进效果 !
HumanGaussian开源:基于Gaussian Splatting,高质量 3D 人体生成新框架
在 3D 生成领域,根据文本提示创建高质量的 3D 人体外观和几何形状对虚拟试穿、沉浸式远程呈现等应用有深远的意义。传统方法需要经历一系列人工制作的过程,如 3D 人体模型回归、绑定、蒙皮、纹理贴图和驱动等。为了自动化 3D 内容生成,此前的一些典型工作(比如 DreamFusion [1] )提出了分数蒸馏采样 (Score Distillation Sampling),通过优化 3D 场景的神经表达参数,使其在各个视角下渲染的 2D 图片符合大规模预训练的文生图模型分布。然而,尽管这一类方法在单个物体上取得了不错的效果,我们还是很难对具有复杂关节的细粒度人体进行精确建模。
机器之心
2023/12/12
7130
HumanGaussian开源:基于Gaussian Splatting,高质量 3D 人体生成新框架
CVPR 2024 | VastGaussian:用于大型场景重建的3D高斯
基于NeRF的方法在处理大型场景时,渲染时间长且渲染效果差。而现有基于3D高斯的方法由于训练内存大、优化时间长和外观变化剧烈,难以扩展到大型场景。
用户1324186
2024/04/12
1.7K0
CVPR 2024 | VastGaussian:用于大型场景重建的3D高斯
FlashSplat: 以最佳方式求解 2D 到 3D 高斯展开分割 !
本研究旨在解决准确分割3D高斯分水(3D-GS) FROM 2D Mask 的挑战。传统方法通常依靠迭代梯度下降为每个高斯分配唯一的标签,导致长久的优化和次优解。
未来先知
2024/12/30
2710
FlashSplat: 以最佳方式求解 2D 到 3D 高斯展开分割 !
VideoScene:以三维感知跳跃流蒸馏策略破局,高效弥合从Sparse视图到三维场景的差距!
高效三维重建的需求正迅速增长,这得益于其实时游戏[83]、自主导航[1]等领域的应用[57, 97]。NeRF[59]和3DGS[35]等技术开创了高质量、密集视点重建,并在真实场景生成中展现出令人印象深刻的性能。然而,这些方法通常需要大量专业拍摄的图像,限制了其可及性[84]。为克服这一限制,研究行人开始探索从Sparse视点进行三维重建[13, 84, 95, 99],将输入要求降低至仅需两张随意拍摄的图像。
未来先知
2025/05/27
540
VideoScene:以三维感知跳跃流蒸馏策略破局,高效弥合从Sparse视图到三维场景的差距!
CVPR2024 | HUGS:人体高斯溅射
真实渲染和人体动态是一个重要的研究领域,具有在AR/VR、视觉特效、虚拟试衣、电影制作等众多应用。早期的工作创建人类化身依赖于多相机捕捉设置中的高质量数据捕捉、大量计算和大量手工努力。最近的工作通过使用3D参数化身体模型如SMPL,直接从视频生成3D化身来解决这些问题,这些模型具有高效光栅化和适应未见变形的能力。然而,参数化模型的固定拓扑结构限制了对衣物、复杂发型和其他几何细节的建模。最近的进展探索了使用神经场来建模3D人类化身,通常使用参数化身体模型作为建模变形的模版。神经场在捕捉衣物、配饰和头发等细节方面表现出色,超越了通过纹理和其他属性光栅化参数化模型所能实现的质量。然而,它们也有不足,特别是在训练和渲染效率方面较低。
用户1324186
2024/05/31
6410
CVPR2024 | HUGS:人体高斯溅射
滑铁卢大学使用谷歌地球图像和高斯溅射进行真实感3D城市场景重建和点云提取!
从2D图像中进行3D重建和建模近年来受到了极大的关注,这要归功于具有3D重建能力的真实感视图合成方法的最新进展。从技术角度来看,这是一个跨计算机视觉、计算机图形学和摄影测量学的交叉研究领域。
AIGC 先锋科技
2024/07/08
1K0
滑铁卢大学使用谷歌地球图像和高斯溅射进行真实感3D城市场景重建和点云提取!
Gamba:仅需0.05秒让一张图片生成高质量3D模型!(新加坡国立大学&天工AI开源)
Github:https://github.com/SkyworkAI/Gamba
AI进修生
2024/12/02
8020
Gamba:仅需0.05秒让一张图片生成高质量3D模型!(新加坡国立大学&天工AI开源)
NeRFs和3D高斯溅射技术如何重塑SLAM:综述
文章:How NeRFs and 3D Gaussian Splatting are Reshaping SLAM: a Survey
点云PCL博主
2024/06/21
1.7K0
NeRFs和3D高斯溅射技术如何重塑SLAM:综述
分割一切「3D高斯」版来了:几毫秒完成3D分割、千倍加速
今年 4 月,Meta 发布「分割一切(SAM)」AI 模型,这项成果不仅成为很多 CV 研究者心中的年度论文,更是在 ICCV 2023 上斩获最佳论文提名 。
机器之心
2023/12/12
6270
分割一切「3D高斯」版来了:几毫秒完成3D分割、千倍加速
FSGS: 基于 Gaussian Splatting 的实时 Few-shot 视角合成
新视角合成是计算机视觉和图形学领域中一项长期存在并且富有挑战的任务。过去两年,NeRF及其衍生工作的提出将该任务提升到了新的高度。然而,基于NeRF的方法的训练和渲染需要大量的成本才能达到理想的效果,比如稠密的输入视角和耗时的训练与渲染。尽管后续的一些稀疏视角NeRF的工作以及InstantNGP的提出在一定程度上解决了部分缺陷,但NeRF方法始终没有做到实时和高质量的高分辨率渲染。
用户1324186
2024/04/12
1K0
FSGS: 基于 Gaussian Splatting 的实时 Few-shot 视角合成
世界模型进入4D时代!单视角视频构建的自由视角4D世界来了
人工智能技术正以前所未有的速度改变着我们对世界的认知与构建方式。近期,李飞飞教授团队通过单张图片生成三维物理世界的研究,再次向世界展示了空间智能技术的巨大潜力。
机器之心
2025/02/14
1670
世界模型进入4D时代!单视角视频构建的自由视角4D世界来了
FlexWorld:引入视频到视频扩散模型与渐进扩展过程,从单张图像高效生成灵活视角3D 场景 !
从单张图像创建具有灵活视角的3D场景,在直接获取3D数据成本高或不切实际的应用领域(如考古保护和自主导航)中具有变革性潜力。然而,这一任务本质上仍然存在困难:单一的2D观测无法提供足够的信息来消除完整的3D结构歧义。特别是,在推理到极端视角(例如,180°旋转)时,之前被遮挡或完全不存在的内容可能会出现,从而引入显著的不确定性。
AIGC 先锋科技
2025/04/18
1150
FlexWorld:引入视频到视频扩散模型与渐进扩展过程,从单张图像高效生成灵活视角3D 场景 !
ICLR 2025|高效重建几何精准的大规模复杂三维场景,中科院提出CityGaussianV2
是否还在担心大规模场景训练和压缩耗时太长、显存开销太大?是否还在苦恼重建出的建筑物和道路表面破碎不堪?是否还在困扰如何定量衡量大规模场景几何重建的精确程度?
机器之心
2025/02/06
1970
ICLR 2025|高效重建几何精准的大规模复杂三维场景,中科院提出CityGaussianV2
纯RGB输入,解决户外场景SLAM!误差降低至9.8%,港科广开源 | ICRA 2025
在自主驾驶、机器人导航、AR/VR等前沿应用中,Simultaneous Localization and Mapping (SLAM) 是核心技术之一。
新智元
2025/03/27
830
纯RGB输入,解决户外场景SLAM!误差降低至9.8%,港科广开源 | ICRA 2025
CVPR 2024 | DNGaussian: 全局局部深度归一化优化的稀疏三维高斯辐射场
从稀疏输入合成新视图对于辐射场来说是一个挑战。神经辐射场(NeRF)的最新进展在仅使用少量输入视图就能重建出高度逼真的外观和准确的几何信息方面取得了卓越成果。然而,大部分基于稀疏视图的NeRF实现速度较慢,内存消耗也较大,导致时间和计算成本很高,限制了它们的实际应用。
用户1324186
2024/05/31
1.5K0
CVPR 2024 | DNGaussian: 全局局部深度归一化优化的稀疏三维高斯辐射场
InstantMesh:利用稀疏视图大规模重建模型从单张图像高效生成3D网格
摘要:本文提出了InstantMesh,这是一个用于从单视角图像生成即时3D网格的前馈框架,具有当前非常优秀的生成质量和显著的训练可扩展性。
一点人工一点智能
2024/04/18
3.2K0
InstantMesh:利用稀疏视图大规模重建模型从单张图像高效生成3D网格
开源 4D 生成框架 | 4DGen: 基于动态 3D 高斯的可控 4D 生成
本文分享4D生成方向新工作,由北京交通大学和得克萨斯大学奥斯汀分校共同完成的4DGen: Grounded 4D Content Generation with Spatial-temporal Consistency,文章使用Gaussian Splatting实现了高质量的4D生成。
CV君
2024/01/02
7780
开源 4D 生成框架 | 4DGen: 基于动态 3D 高斯的可控 4D 生成
告别3D高斯Splatting算法,带神经补偿的频谱剪枝高斯场SUNDAE开源了
本论文作者包括帝国理工学院硕士生杨润一、北航二年级硕士生朱贞欣、北京理工大学二年级硕士生姜洲、北京理工大学四年级本科生叶柏均、中国科学院大学本科大三学生张逸飞、中国电信人工智能研究院多媒体认知学习实验室(EVOL Lab)负责人赵健、清华大学智能产业研究院(AIR)助理教授赵昊等。
机器之心
2024/05/22
4390
告别3D高斯Splatting算法,带神经补偿的频谱剪枝高斯场SUNDAE开源了
每日学术速递12.24
1.On Calibration in Multi-Distribution Learning
AiCharm
2024/12/24
1320
每日学术速递12.24
推荐阅读
增强无界 3D 高斯扫描与视图一致的 2D 扩散优先级,3DGS-Enhancer在NVS增强中的先进效果 !
3810
HumanGaussian开源:基于Gaussian Splatting,高质量 3D 人体生成新框架
7130
CVPR 2024 | VastGaussian:用于大型场景重建的3D高斯
1.7K0
FlashSplat: 以最佳方式求解 2D 到 3D 高斯展开分割 !
2710
VideoScene:以三维感知跳跃流蒸馏策略破局,高效弥合从Sparse视图到三维场景的差距!
540
CVPR2024 | HUGS:人体高斯溅射
6410
滑铁卢大学使用谷歌地球图像和高斯溅射进行真实感3D城市场景重建和点云提取!
1K0
Gamba:仅需0.05秒让一张图片生成高质量3D模型!(新加坡国立大学&天工AI开源)
8020
NeRFs和3D高斯溅射技术如何重塑SLAM:综述
1.7K0
分割一切「3D高斯」版来了:几毫秒完成3D分割、千倍加速
6270
FSGS: 基于 Gaussian Splatting 的实时 Few-shot 视角合成
1K0
世界模型进入4D时代!单视角视频构建的自由视角4D世界来了
1670
FlexWorld:引入视频到视频扩散模型与渐进扩展过程,从单张图像高效生成灵活视角3D 场景 !
1150
ICLR 2025|高效重建几何精准的大规模复杂三维场景,中科院提出CityGaussianV2
1970
纯RGB输入,解决户外场景SLAM!误差降低至9.8%,港科广开源 | ICRA 2025
830
CVPR 2024 | DNGaussian: 全局局部深度归一化优化的稀疏三维高斯辐射场
1.5K0
InstantMesh:利用稀疏视图大规模重建模型从单张图像高效生成3D网格
3.2K0
开源 4D 生成框架 | 4DGen: 基于动态 3D 高斯的可控 4D 生成
7780
告别3D高斯Splatting算法,带神经补偿的频谱剪枝高斯场SUNDAE开源了
4390
每日学术速递12.24
1320
相关推荐
增强无界 3D 高斯扫描与视图一致的 2D 扩散优先级,3DGS-Enhancer在NVS增强中的先进效果 !
更多 >
LV.2
CybersecuritySecurity Researcher
目录
  • # uniapp中实现h5扫码功能(优化版)
    • 前言
    • #一、前期准备
    • #二、服务端开发
      • #1. 抽象appId和appSecret到yml文件中。
      • #2. 编写微信工具类(获取accessToken和ticket)
      • #3. 服务端接口
    • #三、H5前端开发
      • #1. 添加微信js-sdk依赖
      • #2. 获取后台的Request
      • #3. 加载页面后初始化wx.config内容(此处需要放到onLoad中执行)
      • #4. 调用微信扫码功能
      • #5. 完整代码
    • #参考内容
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档