接下来的问题是,当模型是对称的时候,结果是符合预期的,但是当模型是不对称的时候,结果是错误的,如下:

输入: 顶点: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++实现网格水印之调试笔记(四)—— 完成嵌入的更多相关文章

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

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

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

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

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

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

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

    整理了一下要实现的论文Watermarking 3D Polygonal Meshes in the Mesh Spectral Domain,步骤如下: 嵌入水印 à 提取水印 à 优化(网格细分) ...

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

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

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

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

  7. JavaScript特效(调试笔记)

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

  8. Tomcat调试笔记

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

  9. C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻

    前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...

随机推荐

  1. lintcode:Add Binary 二进制求和

    题目: 二进制求和 给定两个二进制字符串,返回他们的和(用二进制表示). 样例 a = 11 b = 1 返回 100 解题: 和求两个链表的和很类似 考虑进位,考虑最后一项的进位 0+0 = 0 不 ...

  2. 转:UGUI与NGUI的区别与优缺点

    1. NGUI与UGUI的区别 1) uGUI的Canvas 有世界坐标和屏幕坐标   2) uGUI的Image可以使用material     3) UGUI通过Mask来裁剪,而NGUI通过Pa ...

  3. 3.Spring-用反射模拟IoC

    1.BeanFactory.java package com.jike.spring.chapter03.reflect; import java.io.InputStream; import jav ...

  4. C++:对象数组

    对象数组 对象数组:每一个数组元素都是对象的数组,也就是说,若一个类有若干个对象,我们把这 一系列的对象用一个数组来存放.对应数组元素是对象,不仅具有的数据成员,而且还有函数 成员. @定义一个一维数 ...

  5. tomcat升级问题

    在本地开发使用myeclipse6.5自带tomcat,部署到服务器上是7.x,导致jsp页面无法解析. 所以想着在本地也使用tomcat7部署,myeclipse6.5不支持tomcat7.x,到网 ...

  6. 深度神经网络入门教程Deep Neural Networks: A Getting Started Tutorial

    Deep Neural Networks are the more computationally powerful cousins to regular neural networks. Learn ...

  7. Java中JNI的使用详解第二篇:JNIEnv类型和jobject类型的解释

    上一篇说的是一个简单的应用,说明JNI是怎么工作的,这一篇主要来说一下,那个本地方法sayHello的参数的说明,以及其中方法的使用 首先来看一下C++中的sayHello方法的实现: JNIEXPO ...

  8. mac下装Ruby

    https://ruby-china.org/wiki/install_ruby_guide

  9. OracleApps Dropship 流程

    做的一个Dropship流程的实录(包括流程期间遇到问题的解决)What are the advantages of Drop Shipment Orders?These are the benefi ...

  10. python 字符串换行的三种方式

    if __name__ == '__main__': #第一种: 三个单引号 print ''' aaaaaaaaaaaaaaaa         bbbbbbbbbbbbbb''' #第二种: 三个 ...