C++实现网格水印之调试笔记(二)

时间:2022-08-30 19:10:09

整理了一下要实现的论文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

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

C++实现网格水印之调试笔记(二)C++实现网格水印之调试笔记(二)

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

C++实现网格水印之调试笔记(二)

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

C++实现网格水印之调试笔记(二)

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

下面来看下实验结果

输入: 输出:

C++实现网格水印之调试笔记(二)C++实现网格水印之调试笔记(二)

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

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

C++实现网格水印之调试笔记(二)

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

C++实现网格水印之调试笔记(二)

修改之后仍然错误。。。

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

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

C++实现网格水印之调试笔记(二)C++实现网格水印之调试笔记(二)

C++实现网格水印之调试笔记(二)

C++实现网格水印之调试笔记(二)C++实现网格水印之调试笔记(二)

C++实现网格水印之调试笔记(二)

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

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

C++实现网格水印之调试笔记(二)C++实现网格水印之调试笔记(二)

C++实现网格水印之调试笔记(二)

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

而当我把模型换成马时,程序中断了C++实现网格水印之调试笔记(二)

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

C++实现网格水印之调试笔记(二)

C++实现网格水印之调试笔记(二)

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

C++实现网格水印之调试笔记(二)

C++实现网格水印之调试笔记(二)

C++实现网格水印之调试笔记(二)

C++实现网格水印之调试笔记(二)

C++实现网格水印之调试笔记(二)

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

C++实现网格水印之调试笔记(二)

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