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

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

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

  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

?

时间: 2024-08-29 11:39:25

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

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

昨天在修改了可以调试出来的错误之后,提取出的水印和嵌入的仍然相去甚远.这个时候我觉得有必要整理一下嵌入和提取的整个过程. 嵌入过程: Step1,嵌入的时候对网格的拉普拉斯矩阵L进行特征值分解,得到特征值和特征向量: Step2,将特征向量单位化: Step3,解方程:R . E = V(1),E,V已知求出R 其中R是频谱系数矩阵,E是单位化的特征向量矩阵,V是顶点坐标矩阵 Step4,修改R的R',其中R'= R + △ (2),R,△已知,求R' Step5,根据矩阵方程(1)求出V',

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

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

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

接下来的问题是,当模型是对称的时候,结果是符合预期的,但是当模型是不对称的时候,结果是错误的,如下: 输入: 顶点:233 输出: 这又是什么鬼...,我的马呢!!! 看来逻辑上还是有错误 注意这时候C++输出的调试信息如下: 错误提示为:Input to EIG must not contain NaN,然后是一堆烫烫烫... 还有一个提示是: Matrix is close to singular or badly scaled. Results may be inaccurate. RCO

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

错误: error C2338: THE_BRACKET_OPERATOR_IS_ONLY_FOR_VECTORS__USE_THE_PARENTHESIS_OPERATOR_INSTEAD 这种错误不会直接定位到行,要自己慢慢看代码,找出不正确的访问. 原因:使用[]访问引起的错误,eigen中矩阵的访问不用用[] 解决方法:将[ ]改为( ) 修改错误之后,编译通过了,但运行时会中断. 调试时,遇到代码不会跳转的问题 当在调试模式下代码运行到eigenDef.calLapMatrix()时,

ollydbg使用笔记(五)

OllyDbg 使用笔记 (五) 参考 书:<加密与解密> 视频:小甲鱼 解密系列 视频 pixtopainbook安装包 下载地址  http://pan.baidu.com/s/191ArG pixtopainbook 破解 pixtopainbook是一个电话簿软件,未注册版本,最多只能添加3个组,每个组最多添加4个人. 去除添加人数跟组数限制 ollydbg 加载 ,按F9运行. 如果OD暂停,在下面出现"异常 E06D7363 - 使用Shift+F7/F8/F9来忽略程序

NLTK学习笔记(五):分类和标注词汇

[TOC] 词性标注器 之后的很多工作都需要标注完的词汇.nltk自带英文标注器pos_tag import nltk text = nltk.word_tokenize("And now for something compleyely difference") print(text) print(nltk.pos_tag(text)) 标注语料库 表示已经标注的标识符:nltk.tag.str2tuple('word/类型') text = "The/AT grand/J

Caliburn.Micro学习笔记(五)----协同IResult

Caliburn.Micro学习笔记(五)----协同IResult 今天说一下协同IResult 看一下IResult接口 /// <summary> /// Allows custom code to execute after the return of a action. /// </summary> public interface IResult { /// <summary> /// Executes the result using the specif

5. 蛤蟆的计算机组成原理笔记五输入输出系统

5. 蛤蟆的计算机组成原理笔记五输入输出系统 本篇名言:"质朴却比巧妙的言辞更能打动我的心. --莎士比亚" 欢迎转载,转载请标明出:http://blog.csdn.net/notbaron/article/details/48037245 1.  输入输出系统 1.1             I/O 软件 (1) I/O 指令 CPU 指令的一部分 (2) 通道指令 通道自身的指令 1.2             I/O设备与主机信息传送的控制方式 1. 程序查询方式 2. 程序中

angular学习笔记(五)-阶乘计算实例(1)

<!DOCTYPE html> <html ng-app> <head> <title>2.3.2计算阶乘实例1</title> <meta charset="utf-8"> <script src="../angular.js"></script> <script src="script.js"></script> </