1D array to 16bits greyscale mat

type problem here, your img struct has an int data pointer
(4 bytes per pixel, not 2, that’s why every second CV_16U pixel is 00)

it should be either:

Mat m(Img.size[1], Img.size[0], CV_32S, Img.data);

(and the range be adjusted)

or ushort *data in the Img struct