技术文章及资料中心

ARTICLE

文章中心

产品

应用

其他

质量

安装使用 您的位置:首页--文章中心--空间光调制器(SLM)

基于DVI连接的SLM二次开发

 

滨松SLM提供了基于DVI线的连接以及基于USB线的两种连接方式。对于基于DVI线的连接方式,SLM会被识别为第二显示器,所以采用DVI连接方式,使用PPT等程序即可以将相位图载入到SLM上显示,整体使用起来比较简便。


而使用USB的连接方式,用户可以获得到SLM的序列号,方便进行多台SLM的控制,并且用户可以获得SLM更多的信息,比如SLM控制板的温度,SLM的运行状态等等。


本篇文章主要介绍基于DVI连接方式的SDK使用方法。针对基于USB连接方式的SDK使用方法,我们会在下篇文章中介绍。


SDK的下载地址为:https://pan.baidu.com/share/init?surl=sxoP-obCKwVYwpQ-ROxv_w, 提取码:SLMD 。SDK下载解压缩之后,内部包含了8个文件夹。

分别是:
1.SDK-MATLAB: 基于MATLAB的SDK
2.SDK-SDK-DLL_Image_Control_64bit:基于Image_Control.dll的SDK文件,可以使用64位的C/C++/C#/LabVIEW调用
3.SDK-SDK-DLL_Image_Control_32bit:基于Image_Control.dll的SDK文件,可以使用64位的C/C++/C#/LabVIEW调用
4.sample_code_Python: 使用Python语言编写的,基于Image_Control.dll的示例程序
5.sample_code_LabVIEW: 使用LabVIEW语言编写的,基于Image_Control.dll的示例程序
6.sample_code_C++: 使用C++语言编写的,基于Image_Control.dll的示例程序
7.sample_code_C#: 使用C#语言编写的,基于Image_Control.dll的示例程序
8.cintools:使用Image_Control.dll需要调用的相关文件


下面我们首先介绍基于MATLAB的SDK的使用方法,然后再介绍使用C#、Python和C++调用Image_Control.dll的使用方法。以下为索引目录,方便查找之用。


目录


一、 基于MATLAB的SDK
1.1 直接载入符合格式要求的相位图片。
1.2 循环播放一组图片
1.3 载入SLMControl3生成的BMP图像
二、 基于ImageControl.dll的SDK使用说明
2.1 ImageControl.dll简介
2.2 使用Python调用ImageControl.dll文件

2.3 使用C++调用ImageControl.dll文件

2.4 使用C#调用ImageControl.dll文件


一、基于MATLAB的SDK


基于MATLAB的SDK包括了fullscreen.m和closecreen.m两个文件,主要是可以将客户计算好的相位图载入到SLM上使用(fullscreen.m),以及停止相位图的载入(closescreen.m).。注意SDK的相位图格式要求是BMP,分辨率要求是1280*1024(对于x13138/x15213/x15223/x13139)或者800*600(对于x10468/x11840/x13267/x13268等)。 将两个m文件都放到MATLAB的当前目录下。主要使用案例如下:


1.1 直接载入符合格式要求的相位图片


closescreen; % 先运行closescreen在运行fullscreen,这样能够保证投屏稳定,否则如果直接先运行fullscreen,可能挪到下鼠标,就投屏消失。
a=imread('test.bmp'); %test.bmp为符合上述格式要求的相位图(灰度值0对应相位值是0,灰度值255对应相位值是2pi);


LUT=193;%由于在载入同样的灰度图情况下,SLM对不同波长的光引入的相位调制不同,为了校正这个影响,我们引入了LUT值。比如SLM对于532nm的光,调制2pi相位对应的灰度值是193. 而针对540nm的光,调制2PI相位对应的灰度值就可能是195; 此处我们假设SLM在工作波长的pixel value to give 2pi值193;本值可以在出厂手册inspection sheet或者slmcontrol3软件中查看到。


a=uint8(LUT/255*double(a));%将相位图处理,使其考虑不同波长LUT不同的影响。 fullscreen(a,2); %将相位图投屏到SLM上,此处虚确认SLM为第二显示器,如果是第三或者第四显示器,将2改为3或者4即可;


%如果想要彻底结束投屏,输入下面,否则无需输入。
%closescreen;


1.2 循环播放一组图片


p=0;
closescreen;
while p<10000%循环次数设置为10000次
for l=1:3 %循环 播放1.bmp, 2.bmp,3.bmp
a=imread([num2str(l),'.bmp']); %载入rbg格式的bmp文件。分辨率要求是x13138是1280*1024,
fullscreen(a,2);
pause(1); %设置播放间隔为1s
end;
p=p+1;
end;
%如果想要彻底结束投屏,输入下面,否则无需输入。
%closescreen;


1.3  载入SLMControl3生成的BMP图像生成的BMP图像


滨松自带软件SLMControl3可以生成并保存一些常见的相位图,比如涡旋光相位,菲涅尔透镜相位,闪耀光栅相位等。虽然生成的图像格式是8bit的bmp图像,但是分辨率依据不同型号而定是1272*1024与792*600,与MATLAB的SDK要求略有区别,下面代码是将SLMcontrol3生成的相位图转化为MATLAB的SDK可以使用的格式图片的示例程序:


a=imread('test_raw.bmp'); %载入8bit bmp格式图片,下面例子是1272*1024的图片。
a=[zeros(1024,4),a,zeros(1024,4)];%左右各加四列,从而将1272*1024矩阵变为1280*1024矩阵
imwrite(a,'test_final.bmp'); %将更新为1280*1024分辨率的图片保存在
test_final.bmp,从而可以让MATLAB的SDK直接调用。


二、基于ImageControl.dll的SDK使用说明


除了基于MATLAB的SDK,滨松也提供了基于"LabVIEW2018" 与 "NI Vision Common Resource 2020"生成的ImageControl.dll的sdk文件,本dll可以使用Python,LabVIEW,C++/C#/C等多种语言调用。滨松提供基于Python/C++/LabVIEW的示例程序。下面首先介绍下ImageControl.dll可以提供的功能,然后详细介绍下如何分别使用Python与C++调用本dll文件。


2.1ImageControl.dll简介


基于ImageControl.dll的sdk分为64位和32为两个版本,内部包含的文件如下:

本SDK对比基于Matlab的SDK主要是多了常见相位图的生成、基于Gerchberg–Saxton(GS)算法的相位图计算等功能,具体可以实现的功能包括:



2.2 使用Python调用ImageControl.dll文件


下面视频以及截图展示如何使用python调用ImageControl.dll文件。


(1)由于本SDK是基于 "NI Vision Common Resource 2020"生成的sdk文件,所以首先需要完成Run-time-engine的安装(安装包在随机器的光盘中提供)。如果最终目标是在64位的程序中使用,请双击光盘中的Installer_for_64bit_SDK文件夹中的install.exe进行安装(注意1:本install.exe不是在安装SLMcontrol3时使用的install.exe,需要单独安装; 注意2:对于出厂日期比较早的SLM,这个驱动在光盘\lcos-slm_control_software_sample_source_code\python_sample_code\Installer for python-64bit位置),如果最终目标是在32位的程序中使用,请双击Installer文件夹中的Install.exe文件进行安装,在安装完成之后,使用SLM的SDK所需要的runtime engine就完成了安装。



(2)为了使用Python的示例程序,我们还需要完成numpy模块,以及PIL模块的安装,以目前常见的Pycharm编译器为例(Pycharm安装和使用可以参考https://www.dotcpp.com/course/217),展示如何安装这两个模块。



a.选择file-settings-project:Pythonproject-Python intepreter,此处就可以查看Python目前已经安装的模块,然后点击图2中的"+"就可以选择模块进行安装。




b. 搜索numpy,并选择Install package;



c. PIL模块在Python3中叫做pillow模块,在上述过程中搜索pillow安装即可。



(3)如何使用示例程序,在提供的示例程序中,包含了所有sdk文件可以使用的功能以及解释说明,所以直接整体是无法运行的。下面以生成锥透镜相位,并且投屏到SLM上为例,展示如何使用本示例程序。本案例的完整程序参考压缩包中:\sample_code_Python\python_sample_code_64bit文件夹中的test.py。


若视频不能切换高清,可点击此处跳转观看


a.首先完成模块的引入


from PIL import Image
import numpy as np
from ctypes import *
import copy


b.完成基本参数设置


# pixelpitch(0: 20um 1: 12.5um)
pitch = 1
# LCOS pixel size
x = 1280
y = 1024
# LCOS-SML monitor number setting
monitorNo = 2 #如果连接一个SLM,默认值是2
windowNo = 0 #默认值是0
xShift = 0
yShift = 0
# pixel number
array_size = x * y
# make the 8bit unsigned integer array type
FARRAY = c_uint8 * array_size
# make the 8bit unsigned integer array instance
farray = FARRAY(0)


c.定义产生axicon相位的函数


def makeAxiconLensArray(top, pitch, x, y, array):
Lcoslib = windll.LoadLibrary("D:\\python_project\\Image_Control.dll") #for windll,LoadLIbrary后路径更改为Image_Control.dll所在的路径
AxiconLens = Lcoslib.AxiconLens
AxiconLens.argtyes = [c_double, c_int, c_int, c_int, c_void_p, c_void_p]
AxiconLens.restype = c_int
if(pitch != 0 and pitch != 1):
print("Error: AxiconLensFunction. invalid argument (pitch).")
return -1
# input argument to dll function.
print(c_int(x*y))
AxiconLens(c_double(top), pitch, x, y, byref(c_int(x*y)), byref(array))
return 0


d. 定义将相位图载入到SLM上的函数


def showOn2ndDisplay(monitorNo, windowNo, x, xShift, y, yShift, array):
Lcoslib = windll.LoadLibrary("D:\\python_project\\Image_Control.dll") #for windll,LoadLIbrary后路径更改为Image_Control.dll所在的路径。


# Select LCOS window
Window_Settings = Lcoslib.Window_Settings
Window_Settings.argtypes = [c_int, c_int, c_int, c_int]
Window_Settings.restype = c_int
Window_Settings(monitorNo, windowNo, xShift, yShift)


# Show pattern
Window_Array_to_Display = Lcoslib.Window_Array_to_Display
Window_Array_to_Display.argtypes = [c_void_p, c_int, c_int, c_int, c_int]
Window_Array_to_Display.restype = c_int
Window_Array_to_Display(array, x, y, windowNo, x * y)


# wait until enter key input
input("please input enter key...")


# close the window
Window_Term = Lcoslib.Window_Term
Window_Term.argtyes = [c_int]
Window_Term.restype = c_int
Window_Term(windowNo)



return 0



e.使用前面定义好的makeAxiconLensArray与showOn2ndDisplay函数完成锥透镜相位的生成以及投屏显示



top = 10.0
makeAxiconLensArray(top, pitch, x, y, farray) #产生axicon相位
#将产生的相位图,显示在SLM上。
showOn2ndDisplay(monitorNo, windowNo, x, xShift, y, yShift, farray)



2.3 使用C++调用ImageControl.dll文件


由于sample_code_C++\sample_code_full文件夹中提供的示例文件包含了多个功能的函数,所以示例文件无法直接运行,因而下面视频以及截图以如何生成axicon lens相位图为例展示SDK的使用方法。相关文件结果在\sample_code_C++\axicon_hpc,客户也可以直接点击文件夹中的sln文件,在基础上进行更改。


使用C++调用ImageControl.dll的SDK也是首先需要完成runtime的安装,具体步骤可以参考2.2.1。


打开visual studio,选择新建项目,点击控制台应用。



然后命名项目,点击创建。



将控制台应用源文件内的代码全部删除。



右键点击项目,选择在文件资源管理器中打开文件夹。



然后sdk中的文件都拷贝进去。



然后将压缩包中的cintools也放入到项目文件夹,如下图:



然后在visual studio中解决方案管理器中的头文件点击右键-添加-选择现有项,选择Image_Control.h。


然后在资源文件处,右键-添加-选择现有项,选择Image_Control.lib, 添加后结果如下:



由于本SDK需要调用extcode.h等一系列文件,所以需要将extcode.h所在的cintools文件夹添加到包含目录中,在解决方案资源管理器内,右键点击项目,然后属性->C/C++->常规,然后附加包含cintools目录:



然后下面以生成axicon lens为例,展示如何使用基于C++的例程。


#include < iostream>
#include "Image_Control.h" //链接库的头文件
#include "stdint.h"//为了使用uint8格式
using namespace std;


int main()
{


//参数的初始化
double top = 10;
uint8_t pitch = 1;
int32_t x = 1272;
int32_t y = 1024;
int32_t total = x * y;
int32_t* size = &total;
uint8_t* array = new uint8_t[1272 * 1024];
AxiconLens(top, pitch, x, y, size, array);//调用AxiconLens函数生成锥透镜相位 cout << "成功" << endl;


return 0;


}


将程序拷贝到cpp文件中;



选择ctrl+f5运行;
运行结果显示"成功",表示dll文件 被成功载入使用。



其余函数使用方法类似,可以参考总的示例文件(sample_code_C++\sample_code_full,双击其中的sln文件即可)。



若视频不能切换高清,可点击此处跳转观看




2.4 使用C#调用ImageControl.dll文件


由于ImageControl.dll属于非托管类型的dll文件,所以无法像常见的C#项目中,通过在“依赖项”位置点击右键,然后选择添加依赖项来引入这个dll文件。下面主要给大家介绍如何引用这个dll文件。具体代码的语法和使用,请参考示例代码文件夹。


(1)打开visual studio,并根据自己的需要创建新项目,注意窗体应用话需要选择.net windwos类型,而不能选择基于.NET Framework的,否则会不好使。下面以控制台应用为例:



(2)设置项目名称和项目位置



(3)设置框架为.net6.0,然后点击创建



(4)在项目选择,右键添加类



(5)添加一个新类,命名为MyDllInterop.cs



(6)然后将示例代码中的MyDllInterop.cs的文件内的内容,都拷贝进刚才新建的类里。具体类的名称,引用哪些函数,如果有特殊需求,可以在这个cs文件基础上更改,



(7)这个时候,在解决方案点击右键,选择重新生成解决方案,



(8)然后再解决方案的位置,右键,选择“在文件资源管理器中打开文件夹”,然后把ImageControl.dll拷贝进bin/debug/net6.0文件夹中,


(9)然后双击Program.cs打开,把下面代码拷贝进cs文件中,


using ConsoleApp4; // MyDllInterop.cs中namespace的名称是ConsoleApp4
byte pixelPitch = 1; // SLM的像素大小,0是20um 1是12.5um
int xPixelTarget = 1272;//SLM的横向像素数,新型号的滨松SLM都是1272,只有老型号X10468和X13139是792
int yPixelTarget = 1024; //SLM的纵向像素数,新型号的滨松SLM都是1024,只有老型号10468和x13139是600
int targetDataSize = 1272 * 1024; //SLM的总像素数


//axiconlens函数独有参数
double topLevelRad = 10; //从相位中心到相位四个角是有多少个pi相位的阶跃
byte[] axiconArrayOut = new byte[1272 * 1024]; // 分配相位图的数组


MyDllInterop.AxiconLens(topLevelRad, pixelPitch, xPixelTarget, yPixelTarget, out targetDataSize, axiconArrayOut); //根据输入的参数,生成相位图数组
Console.WriteLine(axiconArrayOut[1]); //输出第一个元素值,快捷确认函数运行没问题
Console.WriteLine("AxiconLens运行成功");


(8)然后ctrl+f5,运行代码,可以看到下面这个提示,说明运行成功



相关工程师

针对以上内容,如您有任何问题,欢迎联系我们


上一个:滨松空间光调制器LCOS-SLM算法方案:如何自由摆布光束分布

下一个: 空间光调制器LCOS-SLM的MATLAB SDK使用

×
回到顶部