這篇文章主要介紹“processing怎么實(shí)現(xiàn)視覺(jué)抓取小程序”,在日常操作中,相信很多人在processing怎么實(shí)現(xiàn)視覺(jué)抓取小程序問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”processing怎么實(shí)現(xiàn)視覺(jué)抓取小程序”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
創(chuàng)新互聯(lián)建站-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比南譙網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式南譙網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋南譙地區(qū)。費(fèi)用合理售后完善,10余年實(shí)體公司更值得信賴。
用processing寫一個(gè)簡(jiǎn)單的視覺(jué)抓取小程序:識(shí)別紅藍(lán)綠色塊并順序抓放。
import processing.serial.*; import processing.video.*; Serial Port; Capture cam; float[][] kernel ={{0.111,0.111,0.111}, {0.111,0.111,0.111}, {0.111,0.111,0.111} };//卷積核 //中間像素的灰度值等于周圍像素的紅色分量減去藍(lán)綠色分量的平均值 //從而使沒(méi)有紅色特征的像素灰度值變?yōu)榱? //相當(dāng)于濾鏡的效果,修改卷積核的參數(shù),可以達(dá)到不一樣的效果 int sub_x=0,sub_y=0;//物體中心的像素坐標(biāo) float pre_x=0,pre_y=0;//前一幀物體中心的像素坐標(biāo) float tar_x=80,tar_y=80;//目標(biāo)坐標(biāo),機(jī)械手的坐標(biāo) boolean event=false;//坐標(biāo)計(jì)算事件 int c=0; void setup()//初始化 { String portName = Serial.list()[0]; Port = new Serial(this, portName, 115200);//連接串口 size(640,480);//屏幕大小 String[] cameras = Capture.list(); printArray(cameras);//打印可使用的相機(jī) cam = new Capture(this, cameras[0]); cam.start();//啟動(dòng)相機(jī) frameRate(30);//幀率 Port.write("G5 B90\r\n"); Port.write("G28\r\n"); Port.write("G1 X80 Y80 Z40\r\n"); Port.write("G5 B50\r\n");//移動(dòng)到初始位置 delay(6000);//延遲,避免攝像頭剛打開時(shí)的波動(dòng) } void draw()//循環(huán) { if (cam.available() == true) { cam.read(); image(cam, 0, 0, width, height); cam.loadPixels(); int sum_x=0,sum_y=0;//所有紅色像素坐標(biāo)的和 int m=1;//紅色像素的個(gè)數(shù) for(int y=1;y> 16) & 0xFF; //取顏色分量,與red()功能相似 int G = (cam.pixels[pos] >> 8) & 0xFF; int B = cam.pixels[pos] & 0xFF; float val=0; switch(c)//順序抓取紅藍(lán)綠色塊 { case 0: val =R-1.5*B-1.5*G; break; case 1: val =B-1.5*R-1.5*G; break; case 2: val =G-0.5*B-1*R; break; } //1.5為比例系數(shù),改大可以讓紅色更突出 sum +=kernel[ky+1][kx+1]*val;//計(jì)算灰度值 } } if(sum>0)//新的灰度值非零 { sum_x=sum_x+x; sum_y=sum_y+y;//累加坐標(biāo) m=m+1;//計(jì)數(shù) } } } pre_x=sub_x; pre_y=sub_y;//前一幀的物體中心 sub_x=sum_x/m; sub_y=sum_y/m;//取平均,計(jì)算出物體中心像素坐標(biāo) cam.updatePixels(); fill(#FF0000); } line(sub_x,0,sub_x,480); line(0,sub_y,640,sub_y);//作物體中心的兩條交叉線 if(abs(sub_x-pre_x)<5&&abs(sub_y-pre_y)<5&&sub_x>5&&sub_y>5)//判斷是否在移動(dòng)(波動(dòng)小于5個(gè)像素即為靜止),是否存在物體(沒(méi)有物體時(shí)默認(rèn)為0,為避免波動(dòng),這里設(shè)置成5) { if(event==true)//如果物體存在,機(jī)械手靜止,且事件被觸發(fā),則進(jìn)行計(jì)算 { tar_x=tar_x-(0.0625*sub_x-20); tar_y=tar_y-(15-0.0625*sub_y);//把像素坐標(biāo)轉(zhuǎn)化成絕對(duì)坐標(biāo),根據(jù)實(shí)際比例 event=false;//關(guān)閉計(jì)算事件,即只執(zhí)行一次計(jì)算 Port.write("G1 X"+tar_x+" Y"+tar_y+"\r\n");//移動(dòng)到目標(biāo)位置 delay(100);//延遲,減小波動(dòng) } } else //如果機(jī)械手在移動(dòng),觸發(fā)計(jì)算事件,但不執(zhí)行計(jì)算,為機(jī)械手靜止時(shí)計(jì)算做準(zhǔn)備 event=true; /*由于機(jī)械手的通訊以及動(dòng)作上有延遲,速度遠(yuǎn)趕不上攝像頭對(duì)圖像識(shí)別的速度, 所以僅讓機(jī)械臂在靜止時(shí)進(jìn)行一次計(jì)算*/ if(sub_x<5&&sub_y<5) { if(c<3) c=c+1; else c=0; } float mx=tar_x; float my=tar_y+32;//手抓中心對(duì)的坐標(biāo),攝像頭和手抓有32的y偏移量 if(sub_x>315&&sub_x<325&&sub_y>235&&sub_y<245)//當(dāng)物體在畫面中心時(shí)(+-5個(gè)像素) { //執(zhí)行以下動(dòng)作 Port.write("G1 X"+mx+'Y'+my+"Z12 F1200\r\n"); delay(1500);//充分延時(shí) for(int i=50;i<=150;i+=5) { Port.write("G5 B"+i+"\r\n"); delay(50); } delay(500); Port.write("G1 Z30\r\n"); delay(1000); switch(c)//順序擺放紅藍(lán)綠色塊 { case 0: Port.write("G1 X150 Y120\r\n");break; case 1: Port.write("G1 X150 Y100\r\n");break; case 2: Port.write("G1 X150 Y80\r\n");break; } delay(1500); Port.write("G1 Z10\r\n"); delay(500); for(int j=150;j>=50;j-=5) { Port.write("G5 B"+j+"\r\n"); delay(50); } delay(500); Port.write("G1 X80 Y80 Z40\r\n"); delay(1500); if(c<3) c=c+1; else c=0; } println(tar_x); println(tar_y); }
到此,關(guān)于“processing怎么實(shí)現(xiàn)視覺(jué)抓取小程序”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!