在实现提取水印的过程中,遇到了一些问题

首先还是根据论文中的思路来梳理一下整个提取流程

  1. 读入两个模型,一个原始模型ori_mesh, 一个水印模型wm_mesh。
  2. 将两个模型对齐(即放在同一个坐标系下)
  3. 分别计算两个模型的频谱系数,记ori_mesh频谱系数为Rs, Rt, Ru, 记wm_mesh的频谱系数为wRs, wRt, wRu.
  4. 根据下式计算Qj

  5. 再根据下式计算出嵌入水印的符号,这里相当于得到的是嵌入的水印b',只是记为了aj

  6. 最后根据下式得出原始水印序列b

根据上述步骤,我一开始的想法是在网格平台下读入两个模型,然后按照上述步骤进行计算会遇到一些麻烦,比如获取网格的时候,虽然可以用一个链表将打开的文件存放起来,但是在初始化网格的时候,由于参数都是单独的,如果全部都改写成数组或者是链表的话,那改动起来会相当麻烦。于是我决定在嵌入水印的时候,将R矩阵写入文件中,这样提取水印的时候就不必再读入原始网格,只需计算出读入的水印网格中的wR矩阵,然后从文件中读取出R矩阵,两者做差值,再按照原来的步骤进行判断即可。

写入和读取分别如下:

//将原始网格的频谱系数写入文件中Rs

ofstream Rsfile;

Rsfile.open("D:\\Rs.txt",ios_base::out );

if ( Rsfile)

{

for ( int i = 0; i < m_vertexNum; i++)

{

Rsfile<<Rs[i]<<" ";

}

}

Rsfile.close();

//将原始网格的频谱系数从文件中读取出来

double *pRs = new double[m_vertexNum];

double *pRt = new double[m_vertexNum];

double *pRu = new double[m_vertexNum];

//Rs

ifstream Rsfile;

Rsfile.open("D:\\Rs.txt",ios_base::in );

if (Rsfile)

{

// read into memory

Rsfile.seekg (0, Rsfile.end);

int length = Rsfile.tellg();

Rsfile.seekg (0, Rsfile.beg);

char *buffer = new char[length];

Rsfile.read(buffer, length);

Rsfile.close();

// parse into array

std::istringstream iss(buffer);

int i = 0;

while (iss >> pRs[i++]);

delete [] buffer;

// print or use it.

}

Rsfile.close();

在提取的过程中,主要的问题出在sign函数上,由于没有查到sign函数所属的头文件,因此我自己实现了一个sign函数,代码如下:

double EigenDeformation::sign( double x)

{

cout <<"x = "<< x <<endl;

if( x > 0)

return 1;

else if(fabs(x) < 0.000000000001)

return 0;

else

return -1;

}

由于精度的关系,sign函数判断的符号总是不正确,调试查看输入sign函数的值和其输出的只如下:

其中x是输入的值,P是判断后得到的值。

然后常识将输入扩大1kw倍也失败。

改用另外一个函数 double _copysign( double x, double y );

这个函数是C中math.h中的函数,函数功能: 以第二个参数y的符号(正或负)返回第一个参数x,于是在代码中调用形式如下:

wB[i] = _copysign(1, Q[i]) ;

结果如下:

返回符号成功,对比嵌入的水印序列

怎么两者差别这么大。。。

每次运行得到的P的结果都一样。

错误1:将Rt读入文件的时候,写成Rs了

错误2:顶点赋值方式错误

更正:

原始网格的R 水印网格的R

C++实现网格水印之调试笔记(五)—— 提取出错的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. Crazyflie笔记五: CRTP 实时通信协议(一)(转)

    源:Crazyflie笔记五: CRTP 实时通信协议(一) 这里详细介绍了 Crazyflie 的 CRTP实时通信协议的相关内容,由于内容很长,分几篇博文来讲述.这里是第一节内容.欢迎交流:301 ...

  8. Tomcat调试笔记

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

  9. C#可扩展编程之MEF学习笔记(五):MEF高级进阶

    好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...

随机推荐

  1. 是什么让 Ubuntu 选用 Qt 而不是 GTK?

    是什么让 Ubuntu 选用 Qt 而不是 GTK? 一个正在发生的事实,Ubuntu正在不断Qt化!我曾一直在抱怨的Software Center,今日一看源码,竟然有softwarecenter/ ...

  2. NSDictionary 初始化

    NSDictionary *dic1=[NSDictionary dictionaryWithObject:@"1" forKey:@"a"];         ...

  3. 腾讯大讲堂ppt全集

    腾讯大讲堂ppt全集 腾讯大讲堂ppt全集资料下载 腾讯大讲堂ppt1-62资料下载 最新最全的腾讯大讲堂ppt全集 腾讯大讲堂ppt全集资料下载 腾讯大讲堂ppt1-62资料下载地址 http:// ...

  4. 9本java程序员必读的书

    来源:http://mp.weixin.qq.com/s?__biz=MjM5NzA1MTcyMA==&mid=202904638&idx=2&sn=21dd20438e32a ...

  5. BZOJ 3140 消毒(最小顶点覆盖)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3140 题意:最近在生物实验室工作的小T遇到了大麻烦. 由于实验室最近升级的缘故,他的分格 ...

  6. OracleApps Dropship 流程

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

  7. linux/unix网络编程之 select

    转自http://www.cnblogs.com/zhuwbox/p/4221934.html linux 下的 select 知识点 unp 的第六章已经描述的很清楚,我们这里简单的说下 selec ...

  8. JAVA操作Excel 可配置,动态 生成复杂表头 复杂的中国式报表表头

    转载:开源社区http://www.oschina.net/code/snippet_1424099_49530?p=2代码] [Java]代码 该代码实现了Excel复杂表头的生成 基于sql se ...

  9. onkeypress与onkeydown及 oncopy和onpaste 事件区别详细说明

    onkeypress与onkeydown 具体区别: 1. 一个放开一个没有放开,onkeydown 先于 onkeypress 发生. 2.onkeypress 无法系统按钮. 2.onkeydow ...

  10. C# 创建iis站点以及IIS站点属性,iis不能启动站点

    DontLog = False是否将客户端的请求写入日志文件 2011年04月09日 #region CreateWebsite 新增网站 public string CreateWebSite(st ...