You are permuting the tensor from channels-last to channels-first format here:
img_tensor = img_tensor.permute({ 2, 0, 1 }); 

and I don’t see the permutation back to channels-last, which is the expected memory layout in OpenCV.
If you pass a channels-first image to OpenCV, the result would be interleaved, which fits your first posted image.