Matlab: от 3 uint8 до двух 12-битных чисел
У меня есть фрейм-граббер, который возвращает матрицы R, G, B (Итак, X, Y, {R,G,B})
Но мне нужно разделить данные на 2 12 битных векторов; Я не уверен, как это сделать быстро (конвертировать все в строки ужасно).
Если бы кто-то мог мне помочь, я был бы признателен; Спасибо всем!
[Edit] вот что я имею в виду: у меня есть объект данных, который 4-D - X,Y,RGB,FrameNumber.
Так, например, если я делаю: данные (1,1,1,1), я получаю 1-й ряд, 1-й столбец, Красный канал, кадр 1.
Проблема в том, что моя камера имеет инфракрасный порт и фактически выдает 2 12-битные числа (это полностью на заказ). Поэтому мне нужно взять это: данные (1,1,1,1), данные (1,1,2,1), данные (1,1,3,1), объединить их и вернуть пользователю 2x12 бит номера.
Со строками:
data(1,1,1,1) = 0x40
data(1,1,2,1) = 0x37
data(1,1,3,1) = 0x4F
Конкатенация дает мне:
0x40374F
Мне нужно вернуться к пользователю, для этого пикселя: [403,74F]
[Извинение за мой пример: я пытался быстро придумать матрицу 4D в Matlab, и я так долго ее использовал, что мне понадобится время, чтобы понять, как это выглядит на самом деле!]
1 ответ
Может быть, это то, что вы ищете. Я предполагаю, что лежащие в основе данные являются десятичными, а не строкой, и, в свою очередь, ваши выходные данные представляют собой десятичное число, а не строку.
data(1,1,1,1)=hex2dec('40');
data(1,1,2,1)=hex2dec('37');
data(1,1,3,1)=hex2dec('4F');
%convert three numbers to one large one
x=[256^2 256 1]*squeeze(data(1,1,:,1));
%split it in two
out(1)=floor(x/4096);
out(2)=x-out(1)*4096;
%check
fprintf('upper 12 bits in hex: %s\n',dec2hex(out(1)));
fprintf('lower 12 bits in hex: %s\n',dec2hex(out(2)));