V-REP视觉传感器脚本:物体检测与颜色识别
function sysCall_init()
-- 初始化摄像头和传感器
camera = sim.getObjectAssociatedWithScript(sim.handle_self)
sensor=sim.getObjectHandle('conveyorBelt_sensor#0')
-- 创建浮动视图并设置摄像机视角
view = sim.floatingViewAdd(0.9, 0.55, 0.2, 0.1, 0)
sim.adjustView(view, camera ,64)
-- 获取摄像头分辨率和位置
res = sim.getVisionSensorResolution(camera)
cam_pos = sim.getObjectPosition(camera,-1)
-- 设置视角宽度和高度
cam_x = 1
cam_y = 0.25
-- 初始化接近传感器变量
ProximitySensor=0
ProximitySensorprevious=0
tick=0
end
function sysCall_actuation()
-- 该函数在每个仿真步骤中调用,用于执行驱动操作
-- 本脚本中未使用该函数
end
function sysCall_vision(inData)
-- 视觉处理函数,当传感器检测到物体时调用
local data={}
ProximitySensorprevious=ProximitySensor
ProximitySensor=sim.readProximitySensor(sensor)
local handler = inData.handle
-- 当传感器检测到物体接近时
if(ProximitySensorprevious<=0)and(ProximitySensor>0) then
-- 将传感器图像转换为工作图像
simVision.sensorImgToWorkImg(handler)
-- 对红色和绿色物体进行颜色选择
simVision.selectiveColorOnWorkImg(inData.handle,{1.00,0.29,0.21},{0.15,0.15,0.15},true,false,true)
simVision.selectiveColorOnWorkImg(inData.handle,{0.28,1,0.21},{0.15,0.15,0.15},true,true,false)
simVision.addBuffer1ToWorkImg(inData.handle)
-- 进行二值化后的图像处理
local _, ans=simVision.blobDetectionOnWorkImg(handler,0.1,0,false)
packet = sim.unpackFloatTable(ans)
-- 获取检测到的物体信息
local blobCount=packet[1]
local dataSizePerBlob=packet[2]
for i=1,blobCount,1 do
-- 获取物体属性
local blobRelativeSize=packet[2+(i-1)*dataSizePerBlob+1]
local blobOrientation=packet[2+(i-1)*dataSizePerBlob+2]
local blobRelativePos={packet[2+(i-1)*dataSizePerBlob+3],packet[2+(i-1)*dataSizePerBlob+4]}
local realposX=cam_pos[1]+cam_x/2-cam_x*packet[2+(i-1)*dataSizePerBlob+3]-0.012
local realposY=cam_pos[2]+cam_y/2-cam_y*packet[2+(i-1)*dataSizePerBlob+4]
local blobBoxRelativeDimensions={packet[2+(i-1)*dataSizePerBlob+5],packet[2+(i-1)*dataSizePerBlob+6]}
-- 判断物体颜色
local blobCol=sim.getVisionSensorImage(camera,res[1]*blobRelativePos[1],res[2]*blobRelativePos[2],1,1,0)
if (blobCol[1]>blobCol[2])and(blobCol[1]>blobCol[3]) then
colorCode='red'
end
if (blobCol[2]>blobCol[1])and(blobCol[2]>blobCol[3]) then
colorCode='green'
end
-- 将物体信息存储到数据表中
data[i]={realposX,realposY,colorCode}
end
-- 对物体信息进行排序
for i=1,#data-1,1 do
for j=1,#data-i,1 do
if(data[j][1]>data[j+1][1]) then
local relay={}
relay=data[j]
data[j]=data[j+1]
data[j+1]=relay
end
end
end
-- 将数据存储到自定义数据块中
sim.writeCustomDataBlock(handler, 'data3', sim.packTable(data))
sim.setIntegerSignal('getdata', 1)
simVision.workImgToSensorImg(handler)
end
-- 处理完成信号
if(sim.getIntegerSignal('finishDone')==1) then
data={}
sim.writeCustomDataBlock(handler, 'data3', sim.packTable(data))
sim.clearIntegerSignal('finishDone')
end
end
原文地址: https://www.cveoy.top/t/topic/f2oh 著作权归作者所有。请勿转载和采集!