etw做的网站,百度网址浏览大全,德州力点科技 网站建设,网站的ftp账号密码Q#xff1a;我想将I帧的预测图像和原始图像的平均绝对误差给输出来#xff0c;请问这个在JM86中需要在哪一点改动呢#xff1f;谢谢 A#xff1a; 差值保存在diffy中#xff1a; diffy[j][i] imgY_org[img-opix_yj][img-opix_xi] - pred[j][i]; 分析MAD不知道程…Q我想将I帧的预测图像和原始图像的平均绝对误差给输出来请问这个在JM86中需要在哪一点改动呢谢谢 A 差值保存在diffy中 diffy[j][i] imgY_org[img-opix_yj][img-opix_xi] - pred[j][i]; 分析MAD不知道程序中在哪求可以直接搜索MAD“ 结果中有一个函数 img-MADofMB[img-current_mb_nr] calc_MAD(); 就是这个了进去看一下 //calculate MAD for the current macroblock double calc_MAD() { int k,l; int s 0; double MAD; for (k 0; k 16; k) for (l 0; l 16; l) s abs(diffy[k][l]); MADs*1.0/256; return MAD; } 刚好是根据diffy求MAD Q:看了很多的文献不论是经典的二次R-Q模型还是其它什么模型其中总有一个用于表示编码复杂度的变量如二次R-Q模型中是MAD有的模型中是SATD等根据二次R-Q模型的源出文献《Scalable Rate Control for MPEG-4 Video》MAD的引入是为了使模型scalable with video content但是为什么有这种效果却没有讲。请教各位MAD的引入的原因是为了什么有什么数据来证明或文献支持谢谢高手赐教 A:就是为了根据前一帧的复杂度来预测当前帧的复杂度啊。 我说的是R-Q模型中引入了MAD不是使用MAD的线性预测模型 A:《Scalable Rate Control for MPEG-4 Video》中最初得到的二次模型是一个码率和QP之间的关系但是实际中并不是QP越高码率就越小不同的图像复杂度不同对得到的码率也会有影响因此需要对原先的二次模型做一个修正加入图像复杂度这个因素。而对于为什么MAD可以近似代表图像复杂度我想不用我解释了吧自己好好想下就知道了。 Q:道理确实是如此从二次模型的公式来看对某个图像给定QP时BIts/MAD就是一个常数这意味着Bits和MAD就是线性关系但从《Scalable Rate Control for MPEG-4 Video》中并没有看到相关的证明 A:率失真模型中一方面关心的是比特率与QP值或量化步长的关系另外一方面关心的是比特率与图像编码复杂度之间的关系。 假定QP值如果和编码复杂度相互独立的话那么率失真模型应当相当优雅。但是实际的情况并非如此特别是在H.264中。 在MPEG-4及以前版本中计算MAD的方法是用运动估值后的残差信息。这样MAD值与比特之间确实存在一种线性关系注意是线性而不是正比虽然在楼主提到的文献Scalable Rate Control for MPEG-4 Video 中并没有给出图。为了方便或者为了避免一些无法解决的问题该文献将MAD直接写入了二次率失真模型中作为正比项存在并一直主导着视频图像编码的码率控制算法。 在下通过大量的实验数据绘制出了H.264中比特率与MAD的关系甚至是预测MADJVT-G012线性预测方法的关系图。从图中可以看到在H.264中比特率与MAD的线性关系存在但不明显而且线性截距很大不可忽略。比特率与预测MAD的关系可以用不相关三个字来形容。个中特点各自揣摩。 谈一点我个人的看法 MAD如果统计的是运动估值后的残差信息确实可以直接理解为图像的编码复杂度。因为这个时候的MAD已经带有双重特性其一运动估值其二残差。这个时候的MAD的表征对象就是马上用于变换编码和量化的基础。很多早期的文献对此都有评论推导或改进。但是如果MAD不能直接取到的话再用MAD的任何预测形式来做图像复杂度都是自欺欺人的做法。 “从二次模型的公式来看对某个图像给定QP时BIts/MAD就是一个常数” 从在下的若干实验看来BIts/MAD不会是个常数。原因很简单BIts/MADb才是常数b表示截距。我想 Scalable Rate Control for MPEG-4 Video 的作者是知道的但是他不愿这样做所以没有给出图。 另外特别注意MAD和QP不独立在H.264中。 十年放羊 写的“BIts/MADb才是常数”才是常数这个很早就有文献就是在二次模型中那个常数项是不能省掉的我也做了这方面的实验MAD确实与QP有关系而且关系应该能用模型表示出来应该可以进行理论推导 Q:JM86中关了RDO后 原始图像和运动预测补偿后的MAD怎么突然变的很大是什么原因我觉得应该变的小一点才是正确的 为什么差别那么大RDO开着的时候是1点多 关掉的时候是 6点多 不一定RDO最准确RDO只是选择使代价最小的点作为匹配点不一定是最匹配的位置应该是开着RDO好一点因为可以进行模式选择对宏块进行细分 A:你说的对。RDO 最小并不是 MAD 最小。所以 RDO 跟 MAD 之间没有规律性。 Q:在编码中P帧中也有使用帧内预测模式来进行预测编码的那么在计算该P帧的MAD时是否计算帧内预测模式下编码宏块的MAD值在JM配置文件中有没有选项使编码P帧时只使用帧间编码模式将帧内编码模式关掉如果有是哪个参数呢谢谢~~~~~ A:配置文件中没有JM86 可以强制修改 encode_one_macroblock 函数中的 valid 变量 Q:JSVM9.17中jsvmCalcMAD好像不是计算的MAD是SAD啊程序如下 unsigned int MbEncoder::jsvmCalcMAD( IntMbTempData* rpcMbBestData, MbDataAccess rcMbDataAccess ) { UInt uiDist 0; UInt uiDelta 1; Int n, m; IntMbTempData *rpcMbTempData new IntMbTempData; rpcMbTempData-init( rcMbDataAccess ); rpcMbTempData-loadLuma ( *m_pcIntOrgMbPelData ); rpcMbTempData-loadChroma ( *m_pcIntOrgMbPelData ); XPel* pucDst rpcMbBestData-getMbLumAddr(); XPel* pucSrc rpcMbTempData-getMbLumAddr(); Int iStride rpcMbTempData-getLStride(); Int iDeltaXStride uiDelta * iStride; AOF( iStride rpcMbBestData-getLStride() ); for( n 0; n 16; n uiDelta ) { for( m 0; m 16; m uiDelta ) { uiDist abs( pucSrc[m] - pucDst[m] ); } pucSrc iDeltaXStride; pucDst iDeltaXStride; } delete rpcMbTempData; return uiDist; } 最后的uiDist应该再除以16*16才对吧 A:MAD,SAD都是衡量失真的准则其作用就是用来做比较 如果每个块的sad都要除以16x16以后再互相比大小不觉得这很多余么 SAD足矣这里的确是计算的SAD而不是MAD Q:在264的码率控制中要用到MAD值请问对于帧间和帧内编码的宏块其MAD值分别是怎么计算的我在JM代码中看不太明白有知道的朋友能给说说谢谢了 A: I帧和第一个P帧用固定的Qp不进行MAD值的预测从第二个P帧开始利用前一帧相同位置basic unit的MAD值线性预测当前basic unit的MAD值 Q: 我的意思是实际MAD值是怎样计算的 对于帧间编码宏块 MAD原宏块像素值-运动补偿后的预测宏块像素值/256; 对于帧内编码宏块 MAD(原宏块像素值-帧内预测宏块像素值/256 我这样理解对吗 A: 对在JM86代码的calc_MAD() 函数中 Q:都知道在二次模型中有MAD。但是为什么这里要用MAD。有没有文献或者数据的支持呢。为什么可以引入。无论是MAD还是SSD有具体推导的过程吗 A:为某帧编码后大小也即Rate可以用MAD与QP的函数表达, 即 RATEfunction(MAD,QP)q Q:在计算QP的时候有RD的二次关系。但是RD二次模型的基础是图像复杂度相似的情况。D可以由QP表达。引入MAD是为了让图像scalable。 我想知道MAD引入有没有严格的理论证明。 A:是针对 RX1*Q^(-1)X2*Q^(-2)这个式子对吧. X1,X2表征和图像复杂度有关的变量, 实际操作中通过MAD计算, 我没有记错吧? 嗯....那个X1X2的部分我是有点记错了, 不过幸好不是错得很离谱, 式子应该是R/MAD_predictedX1*Q^(-1)X2*Q^(-2) MAD是用来近似描述图像复杂度的一个参数 (scalable这个词在这里怪怪的, 我不是很确定你用这个词在这里的意思), 实际编码不可能存在输入任何源固定一个Q的情况下编出来的比特数都一样嘛. 当然是和源的复杂度有关的. 至于描述复杂度也可以用其他参数, 如上面说的SSD. Q:Q:在JM的码率控制中函数calc_mad()是用来计算一个宏块的MAD而且这个函数encode_one_macroblock()中调用。我想使用前面已经计算过的相邻宏块的MAD那怎么得到它的值呢可有数组储存已经计算出来的MAD的值还有在JVT-G012中MAD线性模型是用来预测基本单元的MAD的那它能和一个宏块的MAD相加吗 A:当然有存储mad的数组了自己跟踪代码就能找到了。mad的和本来就是为了计算每个bu的mad以及每帧的mad当然要把每个mad加起来了。不过单纯的一个bu的mad加上一个不属于该bu的宏块的mad没有什么意义。 Q:请教各位大侠在码率控制中有一部分要预测当前基本单元的MAD。一开始我以为是整个BasicUnit 总的MAD但我看了代码后觉得好像是BasicUnit 中宏块的MAD。 请问到底怎么理解基本单元的MAD呢 A:是整个 BasicUnit 的平均 MAD。也就是 BasicUnit 中所有 MB 的 MAD 求和再平均。提案里就是这么提的就这么做就可以了。 (第二人解释最终得到的值,表示的是当前恢复图像的basic unit 与原始图像中对应的部分,平均每个像素值的差别. Q在jvt-o12,jvt-h017提到的码率控制算法中,帧层码率控制和basic unit的码率控制时都要由前一帧的mad来预测 当前的mad,提案中采用的是线性预测,即: pred_mad C0xprev_mad C1 pred_mad:预测的当前帧mad; prev_mad:为前一帧的实际mad C0,C1为预测系数; 每次帧编码完成后,得到当前帧的实际mad,更新C0,C1; 我的问题是更新C0,C1具体是如何进行的. A经过研究,还是不知道具体采用的了理论是什么,不过看明白了代码的做法.代码做法是对于每个线性预测关系 pred_mad C0xprev_mad C1; 两端乘以prev_mad ,得到 pred_madxpred_mad C0xprev_madxpred_mad C1xpred_mad; 以上两式连立,写成矩阵形式: B AC; 其中 B为1x2,B0 pred_mad,B1 pred_madxpred_mad; A为2x2,A00 1,A01 A10 prev_mad,A11 prev_madxprev_mad; C就是由待更新的C0,C1组成的1x2矩阵. 假设有n个A - B 的对应关系,则可以得到n个Bi AiC(i 1,2,,,n),将这些等式相加,得到总的SUM(B) SUM(A)C; 再由克来母公式计算出C. QA说过无数次了跟代码最接近的是 JVT-H017r3