整理了一下要实现的论文Watermarking 3D Polygonal Meshes in the Mesh Spectral Domain,步骤如下:

嵌入水印 à 提取水印 à 优化(网格细分)

嵌入水印的过程包括一下几个阶段

输入:原始网格

获取拉普拉斯矩阵K

对矩阵K做特征值分解

将原始网格中的顶点投影到特征向量的单位向量上,得到网格频谱系数

修改网格频谱系数

将频谱系数反变换得到顶点坐标

输出:水印网格

目前在嵌入水印阶段遇到了以下错误:

错误:

无法打开文件

"D:\code\GeometryProcessing-1\Debug\GeometryProcess.lib"

解决:这个问题一般是由其他问题所引起的,查看错误列表,从上往下逐个解决错误,这个错误自然就消失了。

打开解决方案时,提示如下语句

!!! Qt4 Add-in was found and closed! !!!

Qt4 and Qt5 versions can't be used at the same time.

Add-in Manager from Tools menu can be used to close Qt5 Add-in and to restart Qt4 Add-in.

解决参考:http://qiusuoge.com/11742.html

以下两个操作是取顶点坐标和将修改后的坐标放入原始的顶点坐标中。

注意,当将修改后的顶点坐标赋回给网格上的顶点时,要使用引用类型

也可以将顶点信息放入一个double数组,然后用指针指向该数组,一遍传入matlab

注意,因为使用了auto类型,所以指针和整数的int j要定义在for循环外面,

下面来看下实验结果

输入: 输出:

什么鬼,肯定是代码写错了,泪

输出前10个点分别看看修改前后的值

从上面的结果看到点的坐标改动太大了,应该是逻辑出现了错误

修改之后仍然错误。。。

之后我开始怀疑是特征值分解的时候出错了

然后我换了其他几个模型,得到的结果如图

以斜杠为分界,左边是原始网格中的点,右边是水印网格中的点

从这个正24面体的顶点改动情况来看,应也是符合预期的,顶点的轻微改动肉眼不宜察觉。

当输入的模型是一个球是,变换明显是错误的。。。

而当我把模型换成马时,程序中断了

使用之前记录的buffer的调试方法,发现是矩阵特征值分解出错了,错误提示如下:

这应该是对于一个非对称的模型,其特征值可能有复数造成的。

如果特征向量之间正交,那么单位化后也是正交的,则在求Rs1时,直接在下式两端乘以e1即可。

拉普拉斯矩阵的特征值分解后得到的特征向量不一定是正交的,因此得到的结果是错误的。

C++实现网格水印之调试笔记(二)的更多相关文章

  1. C++实现网格水印之调试笔记(六)—— 提取完成

    昨天在修改了可以调试出来的错误之后,提取出的水印和嵌入的仍然相去甚远.这个时候我觉得有必要整理一下嵌入和提取的整个过程. 嵌入过程: Step1,嵌入的时候对网格的拉普拉斯矩阵L进行特征值分解,得到特 ...

  2. C++实现网格水印之调试笔记(六)——补充

    调用matlab生成的网格水印特征向量矩阵 从文件中读取的原始网格的特征向量矩阵 好吧,之前得出的结果不正确是因为代码写错了.因为实现论文中的提取方案时代码写错了,自己想了另外一个方法,结果方向两者在 ...

  3. C++实现网格水印之调试笔记(五)—— 提取出错

    在实现提取水印的过程中,遇到了一些问题 首先还是根据论文中的思路来梳理一下整个提取流程 读入两个模型,一个原始模型ori_mesh, 一个水印模型wm_mesh. 将两个模型对齐(即放在同一个坐标系下 ...

  4. C++实现网格水印之调试笔记(四)—— 完成嵌入

    接下来的问题是,当模型是对称的时候,结果是符合预期的,但是当模型是不对称的时候,结果是错误的,如下: 输入: 顶点:233 输出: 这又是什么鬼...,我的马呢!!! 看来逻辑上还是有错误 注意这时候 ...

  5. C++实现网格水印之调试笔记(三)—— 初有结果

    错误: error C2338: THE_BRACKET_OPERATOR_IS_ONLY_FOR_VECTORS__USE_THE_PARENTHESIS_OPERATOR_INSTEAD 这种错误 ...

  6. C++实现网格水印之调试笔记(一)

    首先说一下我的一些简单的调试方法,除了常规的断点调试之外,我还会使用注释的方法来调试.当整个工程代码量相当多且调用层次关系较为复杂时,这种方法能够比较高效的定位到出错误的代码段或某个函数,然后在出现错 ...

  7. Tomcat调试笔记

    调试笔记 在使用Tomcat过程中经常碰到问题,导致tomcat启动失败.如下↓ 由于报错太过笼统,我根本无法找出错误.后来我切换到Console视图下,看到了如下错误信息. 根据报错信息,错误原因是 ...

  8. JavaScript特效(调试笔记)

    JavaScript特效 一.在网页上显示当前的时间日期,例如:“2016年3月26日 星期六”. js源代码: function getTime() { var today = new Date() ...

  9. webpy使用笔记(二) session/sessionid的使用

    webpy使用笔记(二) session的使用 webpy使用系列之session的使用,虽然工作中使用的是django,但是自己并不喜欢那种大而全的东西~什么都给你准备好了,自己好像一个机器人一样赶 ...

随机推荐

  1. Linux awk小记

    预备知识: -F:表示某行使用的分隔符,默认是空格: NR:表示当前是第几行: NF:表示文件中的某行根据分隔符共有几列: 1.打印某一列 awk '{print $1}' text.txt 其中$0 ...

  2. React Jest测试

    一. var jest = require('jest'); jest.dontMock('../CheckboxWithLabel.js'); describe('CheckboxWithLabel ...

  3. 修改 eclipse 文件编码格式

    如果要使插件开发应用能有更好的国际化支持,能够最大程度的支持中文输出,则最好使 Java文件使用UTF-8编码.然而,Eclipse工作空间(workspace)的缺省字符编码是操作系统缺省的编码,简 ...

  4. 机器学习 —— 概率图模型(推理:MAP)

    MAP 是最大后验概率的缩写.后验概率指的是当有一定观测结果的情况下,对其他随机变量进行推理.假设随机变量的集合为X ,观察到的变量为 e, W = X-e , AP = P(W|e). 后验概率和联 ...

  5. spring boot 1.4默认使用 hibernate validator

    spring boot 1.4默认使用 hibernate validator 5.2.4 Final实现校验功能.hibernate validator 5.2.4 Final是JSR 349 Be ...

  6. 2014年百度之星程序设计大赛 - 初赛(第一轮) hdu Grids (卡特兰数 大数除法取余 扩展gcd)

    题目链接 分析:打表以后就能发现时卡特兰数, 但是有除法取余. f[i] = f[i-1]*(4*i - 2)/(i+1); 看了一下网上的题解,照着题解写了下面的代码,不过还是不明白,为什么用扩展g ...

  7. uva live 6170

    Esspe-Peasee Esspe-Peasee is an ancient game played by children throughout the land of Acmania. The ...

  8. bzoj2326: [HNOI2011]数学作业

    矩阵快速幂,分1-9,10-99...看黄学长的代码理解...然而他直接把答案保存在最后一行(没有说明...好吧应该是我智障这都不知道... #include<cstdio> #inclu ...

  9. UVa 11400 Lighting System Design【DP】

    题意:给出n种灯泡,分别给出它们的电压v,电源费用k,每个灯泡的费用c,和所需灯泡的数量l,问最优方案的费用 看的紫书= = 首先是dp[i]为灯泡1到i的最小费用, dp[i]=min(dp[i], ...

  10. SQL Server索引怎么用

    什么是索引 拿汉语字典的目录页(索引)打比方:正如汉语字典中的汉字按页存放一样,SQL Server中的数据记录也是按页存放的,每页容量一般为4K .为了加快查找的速度,汉语字(词)典一般都有按拼音. ...