搜索
bottom↓
回复: 13

LED自行车轮 数据取模matlab程序

[复制链接]

出0入0汤圆

发表于 2011-4-29 21:07:35 | 显示全部楼层 |阅读模式
坛里面已经有网友发的取模软件:
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4571756&bbs_page_no=1&bbs_id=9999

但是是EXE二进制文件,不是太方便用户根据自己的实际需求做出修改。

现把自己在matlab下写的取模程序贴出来,方便能用到的网友。

- - - - - - - - - - - - - - - - - - - - -
% test_led_wheel
% for your reference

ri    = 0.1;

div_p = 128;
% div_p = 256;

div_r = 24;
% div_r = 36;

bit   = 4;

% read RGB from img
img_w = size(img, 2);
img_h = size(img, 1);
img_cx = round(img_w / 2 - 1);
img_cy = round(img_h / 2 - 1);
img_r  = min(img_cx, img_cy);


figure;
  hold on;
  axis equal;
  whitebg('k');
  xlim([-1.1, 1.1]);
  ylim([-1.1, 1.1]);

for i=1:div_p
%     plot([ri*cos(2*pi*i/div_p), cos(2*pi*i/div_p)], ...
%          [ri*sin(2*pi*i/div_p), sin(2*pi*i/div_p)]);
    for j=1:div_r
        pr = ((1-ri)/(div_r-1)*(j-1)+ri);
        px1 = cos(2*pi*(i-1)/div_p);
        px2 = cos(2*pi*(i)/div_p);
        py1 = sin(2*pi*(i-1)/div_p);
        py2 = sin(2*pi*(i)/div_p);
%         pc  = [i/div_p,j/div_r,(2-i/div_p-j/div_r)/2];
        ix = min(round(img_cx + img_r*px1*pr)+1, img_w);
        iy = min(round(img_cy + img_r*py1*pr)+1, img_h);
        icr = img(iy, ix, 1);
        icg = img(iy, ix, 2);
        icb = img(iy, ix, 3);
        pc = single([icr, icg, icb]/2^(8-bit)) * 2^(8-bit) / 256;

        plot( pr * px1, -pr * py1,  '.', ...
              'MarkerEdgeColor', pc );
    end;
end;

% byte = div_r * div_p * bit / 8
% dw   = 0.7; % m
% v    = 40;  % km/h
% n    = v/3.6/dw/pi % rps
% dt   = 1/n/div_p * 1000 % ms


- - - - - - - - - - - - - - - - - - - - -

效果图:


效果图1 (原文件名:fnems.jpg)


效果图2,这张离近看不清的,要站在离屏幕远一点的地方才能看出效果 (原文件名:fnems2.png)





阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2011-4-29 21:07:59 | 显示全部楼层
程序解读:


运行程序之前,需要先用matlab导入一张图像,将其点阵数据保存成变量img。
导入可以用imtool命令打开图像工具箱然后导入,也可以在matlab主菜单中import data那里

(原文件名:import.png)



开头,

ri    = 0.1;
指定环内径比例(按外径ro=1,比如外径330mm那么内径330×0.1=33mm)

div_p = 128;
是设定自行车轮转一周要刷新的次数,或者说圆周分辨率。

div_r = 24;
是半径上面布置的LED数量。或者说半径分辨率。


bit   = 4;
是每个点的数据位数。bit有效取值:1~8

img_w = size(img, 2);
img_h = size(img, 1);
img_cx = round(img_w / 2 - 1);
img_cy = round(img_h / 2 - 1);
img_r  = min(img_cx, img_cy);
获得图像的宽、高、中心坐标、有效半径

两个循环里面,
        pr = ((1-ri)/(div_r-1)*(j-1)+ri);
        px1 = cos(2*pi*(i-1)/div_p);
        px2 = cos(2*pi*(i)/div_p);
        py1 = sin(2*pi*(i-1)/div_p);
        py2 = sin(2*pi*(i)/div_p);
将圆坐标转换成平面直角坐标


        ix = min(round(img_cx + img_r*px1*pr)+1, img_w);
        iy = min(round(img_cy + img_r*py1*pr)+1, img_h);
取对应点图上的坐标


        icr = img(iy, ix, 1);
        icg = img(iy, ix, 2);
        icb = img(iy, ix, 3);
取图片对应点的颜色,r、g、b分量

        pc = single([icr, icg, icb]/2^(8-bit)) * 2^(8-bit) / 256;
转换成matlab的颜色空间(r、g、b都在0~1之间)

plot画图

出0入0汤圆

 楼主| 发表于 2011-4-29 22:17:07 | 显示全部楼层
如果有网友想得到灰色图像,那么

在进入循环之前加上
img = rgb2gray(img);

然后把
        icr = img(iy, ix, 1);
        icg = img(iy, ix, 2);
        icb = img(iy, ix, 3);
        pc = single([icr, icg, icb]/2^(8-bit)) * 2^(8-bit) / 256;
改成
        ic = img(iy, ix, 1);
        pc = single([ic, ic, ic]/2^(8-bit)) * 2^(8-bit) / 256;
就行了

出0入0汤圆

发表于 2011-4-29 22:59:02 | 显示全部楼层
回复【2楼】fnems  
-----------------------------------------------------------------------

你好,怎么从matlab转成c语言代码啊?另,RGB值要转成0-255之间的形式,是不是rgb(0-1)的值乘以256?如果能直接用jpg、bmp、gif等图片格式而不用转换成img那就太好了

出0入0汤圆

发表于 2011-5-8 15:43:04 | 显示全部楼层
回复【3楼】bruce007
-----------------------------------------------------------------------

imread() 你说的那几种格式都能读

出0入0汤圆

 楼主| 发表于 2011-5-8 17:55:51 | 显示全部楼层
回复【3楼】bruce007  
-----------------------------------------------------------------------
不好意思刚看到回复

因为数据跟所用的位数有关,所以自己没有写保存数据的代码。

Matlab有文件处理函数。在循环体里面把pc保存下来,写到文件里面就好了
(可以参考matlab的帮助文件)
pc是pixie color的意思

pc的值是0~1

如果用8个位表示颜色,那么保存的时候pc乘以256
如果用4个位表示颜色(16灰度),那么一个字节的8个位可以表示两个点的颜色信息,保存的时候pc乘以16。
如果用单色,那么就不要用rgb格式。
所以具体保存格式就留给用户自己解决咯

出0入0汤圆

发表于 2011-5-8 18:28:30 | 显示全部楼层
MARK 顶,本来准备用C#写的一个的,后来一直忙了  悲情~

出0入0汤圆

发表于 2011-5-8 20:00:54 | 显示全部楼层
mark,很不错,收藏了。

出0入0汤圆

发表于 2011-5-26 20:10:39 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-26 21:09:26 | 显示全部楼层
看不懂啊!
正好我这几天打算做这个,简单的单色的取模C语言该怎么写?32点,一周256分。

出0入0汤圆

发表于 2011-5-29 14:23:54 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-5-26 18:43:45 | 显示全部楼层
才买了辆新车      没事 玩玩   

出0入0汤圆

发表于 2013-3-5 16:49:14 | 显示全部楼层
mark。。。。

出0入0汤圆

发表于 2019-1-15 13:19:22 | 显示全部楼层
好厉害,顶一个,有运行的EXE执行文件吗?我想做一个玩玩
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-18 22:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表