First, and most obviously, two independent methods will never fully agree.
Second, while the DESeq2-related code in fact gets the normalized counts based on the size factors the edgeR/voom code extract the voom-transformed counts, but that is not the normalized counts itself. I would need to go back to the limma docs and paper to check what exactly the
E slot stores, but I think (please edit for a definite answer) it's normalized counts after the voom transformation. In contrast, the edgeR normalized counts in the sense of what woul be most comparable to the DESeq2 normalized counts would be obtained with the
edgeR::cpm() function. Check the manual. At no point of either the limma or edgeR manual it says that
v$E should be used for anything outside of the linear modelling. It clearly recommends to use
cpm(). Limma and edgeR are packages that have hundreds of forum questions and blog entries, many functions do exist and the packages change over time, so indeed it can be confusing what to do, but therefore I strongly recommend to consult the current manual at Bioconductor as the sole reliable reference on how to get values from the objects and how to run your analysis.
By the way, don't be surprised that the DESeq2 and edgeR normalized counts will be on different scales. DESeq2 gets the counts by dividing the raw counts by the size factors while edgeR first calculates naive per-million counts and then corrects these with the TMM factors calculated by
calcNormFactors, so the magnitude of the counts can be quite different, simply by how it is calculated.