processing怎么實(shí)現(xiàn)視覺(jué)抓取小程序

這篇文章主要介紹“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)建站-專(zhuān)業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性?xún)r(jià)比南譙網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式南譙網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋南譙地區(qū)。費(fèi)用合理售后完善,10余年實(shí)體公司更值得信賴(lài)。

用processing寫(xiě)一個(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}
                   };//卷積核
//中間像素的灰度值等于周?chē)袼氐募t色分量減去藍(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);//延遲,避免攝像頭剛打開(kāi)時(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<cam.height-1;y++)//排除第一行、最后一行、第一列、最后一列像素(這幾個(gè)地方周?chē)南袼夭煌暾?
    {
      for(int x=1;x<cam.width-1;x++)//經(jīng)過(guò)所有像素
      {
        float sum=0;//最終的灰度值
        for(int ky =-1;ky<=1;ky++)
        {
          for(int kx=-1;kx<=1;kx++)//周?chē)?個(gè)像素(包括自身)
          {
          int pos =(y+ky)*cam.width+(x+kx);//將xy坐標(biāo)換算成pixels[]數(shù)組中的位置,pixels[]數(shù)組是可以直接調(diào)用的儲(chǔ)存像素的一維數(shù)組(從左到右從上到下)
          int R = (cam.pixels[pos]>> 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í)別的速度,
    所以?xún)H讓機(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)物體在畫(huà)面中心時(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í)用的文章!

文章名稱(chēng):processing怎么實(shí)現(xiàn)視覺(jué)抓取小程序
網(wǎng)頁(yè)網(wǎng)址:http://muchs.cn/article8/geppip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、用戶(hù)體驗(yàn)網(wǎng)站維護(hù)、企業(yè)建站、商城網(wǎng)站、軟件開(kāi)發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)