C++实现网格水印之调试笔记(四)—— 完成嵌入
接下来的问题是,当模型是对称的时候,结果是符合预期的,但是当模型是不对称的时候,结果是错误的,如下:
输入: 顶点:233

输出:

这又是什么鬼。。。,我的马呢!!!
看来逻辑上还是有错误
注意这时候C++输出的调试信息如下:

错误提示为:Input to EIG must not contain NaN,然后是一堆烫烫烫。。。
还有一个提示是: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND = 8.367225e-021.
初步估计是matlab计算模型特征值时出错了。这里一直困惑我的地方是,为什么输入一个对称的模型时,计算的结果没有问题,当输入一个非对称的模型时,却会出现上述结果?
然后我查看了之前计算矩阵特征值的matlab代码,

其中eigs是matlab中自带的对矩阵做特征分解的方法。通过错误提示可以看出,在matlab的eigs函数中的第94行出现了错误,打开matlab可以继续查看进一步的调用中出现的错误,总结起来应该是输入的矩阵中有一些无效值。然后我检查了一下计算拉普拉斯矩阵的方法。我用的是形式是下式中的第一个,


也就是说,用到了面积信息。当出现面积为0的情况时,0就作为除数了。论文中本来的拉普拉斯矩阵的计算方法是 L= D – A,其中D为对角矩阵,其对角元素为顶点的度,A为邻接矩阵。思考再三,决定重新写拉普拉斯矩阵的计算方法以及特征值分解的算法。
各矩阵的获取方式如下:


以及matlab特征值分解的代码

修改了代码后的输出:(当然首先来看我的马了=。=)

两个模型的对比:

用线勾勒出的是嵌入水印后的模型
下面两张图是一些细节


然后再看看兔子。输入: 顶点1187

最后再用一开始的圆柱验证一下。顶点:1180,两个模型用肉眼看几乎是重合的

从上面的结果来看,第一部分嵌入水印的工作应该是完成了。接下来就是提取水印了。
C++实现网格水印之调试笔记(四)—— 完成嵌入的更多相关文章
- C++实现网格水印之调试笔记(六)—— 提取完成
昨天在修改了可以调试出来的错误之后,提取出的水印和嵌入的仍然相去甚远.这个时候我觉得有必要整理一下嵌入和提取的整个过程. 嵌入过程: Step1,嵌入的时候对网格的拉普拉斯矩阵L进行特征值分解,得到特 ...
- C++实现网格水印之调试笔记(六)——补充
调用matlab生成的网格水印特征向量矩阵 从文件中读取的原始网格的特征向量矩阵 好吧,之前得出的结果不正确是因为代码写错了.因为实现论文中的提取方案时代码写错了,自己想了另外一个方法,结果方向两者在 ...
- C++实现网格水印之调试笔记(五)—— 提取出错
在实现提取水印的过程中,遇到了一些问题 首先还是根据论文中的思路来梳理一下整个提取流程 读入两个模型,一个原始模型ori_mesh, 一个水印模型wm_mesh. 将两个模型对齐(即放在同一个坐标系下 ...
- C++实现网格水印之调试笔记(二)
整理了一下要实现的论文Watermarking 3D Polygonal Meshes in the Mesh Spectral Domain,步骤如下: 嵌入水印 à 提取水印 à 优化(网格细分) ...
- C++实现网格水印之调试笔记(三)—— 初有结果
错误: error C2338: THE_BRACKET_OPERATOR_IS_ONLY_FOR_VECTORS__USE_THE_PARENTHESIS_OPERATOR_INSTEAD 这种错误 ...
- C++实现网格水印之调试笔记(一)
首先说一下我的一些简单的调试方法,除了常规的断点调试之外,我还会使用注释的方法来调试.当整个工程代码量相当多且调用层次关系较为复杂时,这种方法能够比较高效的定位到出错误的代码段或某个函数,然后在出现错 ...
- JavaScript特效(调试笔记)
JavaScript特效 一.在网页上显示当前的时间日期,例如:“2016年3月26日 星期六”. js源代码: function getTime() { var today = new Date() ...
- Tomcat调试笔记
调试笔记 在使用Tomcat过程中经常碰到问题,导致tomcat启动失败.如下↓ 由于报错太过笼统,我根本无法找出错误.后来我切换到Console视图下,看到了如下错误信息. 根据报错信息,错误原因是 ...
- C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻
前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...
随机推荐
- hdu 3863 No Gambling
#include<stdio.h> int main() { int n; ) { printf("I bet on Oregon Maple~\n"); } ; } ...
- Android:打包apk
右击项目->导出export next,完成相关信息填写将得到.apk文件,即可部署到手机上. 第一次: 然后打开目录就可以看到生成的apk,可以发布到各大市场上.
- java.util.regex.PatternSyntaxException: Unclosed character class near index解决办法
使用str.split("[")时,出现java.util.regex.PatternSyntaxException: Unclosed character class near ...
- Android AIDL-跨进程
Android在设计理念上强调组件化,组件之间的依赖性很小.我们往往发一个Intent请求就可以启动另一个应用的Activity,或者一个你不知道在哪个进程的Service,或者可以注册一个广播,只要 ...
- 【原创】Leetcode -- Reverse Linked List II -- 代码随笔(备忘)
题目:Reverse Linked List II 题意:Reverse a linked list from position m to n. Do it in-place and in one-p ...
- Android XML使用的学习记录
1. 注释其中一段代码或是一行,可以采用<!-- -->,示例如下 <!-- <EditText android:layout_width=&quo ...
- fil_system_struct
/** The tablespace memory cache */ typedef struct fil_system_struct fil_system_t; /** The tablespace ...
- I.MX6 Ethernet UI patch failed
/*********************************************************************** * I.MX6 Ethernet UI patch f ...
- PHP单元测试工具PHPUnit初体验
今天接到了个任务,需要对数字进行计算,因为涉及到整数,小数,和科学计数法等很多条件,所以人工测试非常麻烦,于是想到了PHP的单元测试工具PHPUnit,所以写个文档备查. 看了PHPUnit的文档之后 ...
- temp - Linux administration handbook 答案
我开始做第一章后的练习题,发觉不是很容易随意地回答,就像是C++ primer之后的练习题的感觉. 自己有这么多不会的,让我感觉很不爽啊- -! 先不要要求自己一下子都明了,一口吃不成胖子,先找一份工 ...