在MySQL中存储matlab数组。再次

时间:2014-01-23 07:59:20

标签: mysql matlab

我在uint16的Matlab中有一个3D数组(基本上它只是一个图像1080x1920x3)。我想将它存储在mysql中。这就是我正在做的事情:

MySQL的:

create table imgtest(img longblob);

Matlab的:

% image_data - is my image as described before
raw_im = reshape(image_data,1,[]);
conn = database('test','root','root','Vendor','MySQL','Server','localhost')
x = conn.Handle;
insertcommand = ['INSERT INTO imtest (img) values (?)'];
StatementObject = x.prepareStatement(insertcommand);
StatementObject.setObject(1,raw_im)
StatementObject.execute

问题是我在这个blob字段中写了大约600k uint16值。但是当我从数据库中取出这个字段时,我总是得到大约120万个uint8元素(恰好是两倍)。

那么,有没有办法将这个字节字段作为一组uint16读取,而不是uint8?

谢谢。

3 个答案:

答案 0 :(得分:2)

我为我的一个项目做了类似的事情

基本上有一个区别,但也许它会向你澄清一些东西 我使用命令

将图像直接从文件加载到DB
INSERT INTO BaseImage(Image) 
SELECT * FROM OPENROWSET(BULK N'C:\co.jpg', SINGLE_BLOB) as image

并将其恢复到Matlab需要进行类型转换(就像@sebastian提到的那样)

SQL_query = 'select TOP 1 pk_BaseImage,Image from BaseImage order by pk_BaseImage desc';
[data] = SQL_query_exec(SQL_query);
pk_BaseImage = data.Data.pk_BaseImage;
out = typecast(data.Data.Image{1,1},'uint8');

,但.. 这还不够,我不得不做一些使用'out'作为图像的技巧 我被迫将它写入临时文件并再次将其读取到Matlab(我知道它很奇怪,但它工作得非常好,我可以例如计算DWT,DFT等)

image_matrix = get_image_matrix( out );

get_image_matrix函数如下所示:

function [ out ] =  get_image_matrix( input )
targetfilename = 'temp.jpg';
%wynik
fid = fopen(targetfilename,'w');
if fid
    fwrite(fid,input,'uint8');
end
    fclose(fid);
    out = imread(targetfilename);
    delete(targetfilename);
end

我希望它能帮到你:) 一个重要的通知 - 我使用灰度图像(uint8型)

答案 1 :(得分:1)

您最有可能将uint8转换为uint16,以恢复原始图像数据:

uint16_result = typecast(uint8_result, 'uint16');

我不熟悉数据库工具箱 - 所以很可能有办法告诉Matlab自己做这件事。

答案 2 :(得分:0)

好的,谢谢你们俩。我总结了你的答案,这就是我所得到的:

由于blob字段只不过是字节数组,因此我们应该先将数据转换为matlab,然后再将其写入数据库。从DB中读取后,我们应该把它们丢回来。

最低工作示例是: MySQL的

create table imgtest(img longblob);

Matlab的

% image_data - is my image as described before
raw_im = typecast(reshape(image_data,1,[]),'uint8'); %! the main string
conn = database('test','root','root','Vendor','MySQL','Server','localhost')
x = conn.Handle;
insertcommand = ['INSERT INTO imtest (img) values (?)'];
StatementObject = x.prepareStatement(insertcommand);
StatementObject.setObject(1,raw_im)
StatementObject.execute

我们可以读回来之后:

res = exec(conn,'Select * from imtest')
array_uint8 = fetch(res);
array_uint8 = array_uint8{1};
array_uint16 = typecast(array_uint8,'uint16').

希望这会对某人有所帮助。