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
V-REP视觉传感器脚本:物体检测与颜色识别

原文地址: https://www.cveoy.top/t/topic/f2oh 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录