Sida 6 av 16

Re: Korkens Optical Flow sensor

Postat: 4 februari 2014, 17:45:18
av Korken
Liten uppdatering.

Nu så har jag bara testat att lägga komponenter på för att se så allt passar och självklart har ett fel smygit sig in.
Min design på linshållaren vart fel så monteringshålen passar inte, detta är fixat och så ska jag beställa nya kort. Men ska se om jag kan limma fast linshållaren så jag kan testa lite.

Re: Korkens Optical Flow sensor

Postat: 5 februari 2014, 11:13:45
av Korken
Så, har testat att limma en linshållare och det va mycket svårt att få bra. :(
Så det blir att beställa nya kort, köra iteadstudio med UPS expressfrakt och hoppas det går fort. Vet att korten brukar bli klara på en vecka men frakten tar en livstid - detta får UPS fixa.
Kinesiska nyåret slutar imorgon så det kanske tar lite tid innan de kommer igång, men har väldigt mycket på jobbet just nu så har lite dåligt med tid så det passar lite. :)

Re: Korkens Optical Flow sensor

Postat: 5 februari 2014, 11:24:07
av Agwan
Vad var det som var svårt med limningen?

Re: Korkens Optical Flow sensor

Postat: 5 februari 2014, 16:55:09
av Korken
Det som blev problem va att lim siprade lätt in till kamera sensorn samt att det vart väldigt kinkigt med centrering.
Nåväl, det är inte hela värden just nu.

Re: Korkens Optical Flow sensor

Postat: 23 februari 2014, 14:28:39
av Korken
Nu är de nya korten skickade (för ett par dagar sen med UPS) och borde landa på måndag/tisdag! :D

Re: Korkens Optical Flow sensor

Postat: 23 februari 2014, 22:16:32
av Agwan
Spännande. Skall bli intressant att se vad det blir för precision.

Har du kommit en bit med kodningen? Vilka konfigurationsmöjligheter kommer det finnas, hur ställer jag in dem. Hur får jag förflyttningedatat från kortet?

Re: Korkens Optical Flow sensor

Postat: 24 februari 2014, 16:50:44
av Andax
Såg att det fanns en kickstarter som kallades pixy. Det är nästan samma hårdvaru-upplägg, fast de klustrade efter färg och kunde tracka föremål. Du kan ju lägga in alternativa algoritmer för att bredda användningsområdet.

Re: Korkens Optical Flow sensor

Postat: 24 februari 2014, 17:04:47
av Korken
Jag såg den kickstartern. :) Skillnaden är att de använder en FPGA och jag kör med en Cortex-M4, annars är de nog ganska lika.
Jag funderade på att köra med en FPGA, men har inte nog med kunskap med dessa för att klara detta tror jag. :humm:

Re: Korkens Optical Flow sensor

Postat: 24 februari 2014, 17:26:47
av perra_e
Enligt deras sida kör dom också Cortex M4 med en LPC4330.

Kod: Markera allt

Technical specs
• Processor: NXP  LPC4330, 204 MHz, dual core 
• Image sensor: Omnivision OV9715, 1/4", 1280x800 
•Lens field-of-view: 75 degrees horizontal, 47 degrees vertical
•Lens type: standard M12 (several different types available)
•Power consumption: 140 mA typical
•Power input: USB input (5V) or unregulated input (6V to 10V)
•RAM: 264K bytes
•Flash: 1M bytes
•Available data outputs: UART serial, SPI, I2C, USB, digital, analog
•Dimensions: 2.1" x 1.75" x 1.4"

Re: Korkens Optical Flow sensor

Postat: 24 februari 2014, 17:42:54
av Korken
Där ser man! Var 100% säker på att de hade en FPGA.
Men då är de dom gjorde mycket coolare! :tumupp:

Största skillnaden är nog då att jag har en annan kamera sensor, men annars inte så mycket.

Re: Korkens Optical Flow sensor

Postat: 25 februari 2014, 15:21:07
av Korken
Äntligen har de nya kretskorten landat! :D Dock så vart det svart fast att jag beställde blå.
Blir att löda till helgen. :)

Tog med en XT60 kontakt som storleksreferens.
2014-02-25 15.16.52.jpg

Re: Korkens Optical Flow sensor

Postat: 30 mars 2014, 21:02:26
av Agwan
Hur går det med det här projektet. Har du någon plan på när de kan vara uppe och köra?

Re: Korkens Optical Flow sensor

Postat: 30 mars 2014, 21:55:30
av Korken
Står tyvärr stilla just nu, lägger all tid på KFly.
Så fort KFly flyger (dvs alla basfunktioner) så ska jag starta upp detta igen. :) Har alla komponenter och PCBer så behöver bara löda ihop det och börja koda!

Re: Korkens Optical Flow sensor

Postat: 11 september 2014, 19:40:21
av Korken
Då kör vi uppdateringen på phase correlation som lovades i KFly tråden! :) Detta är då en helt annat sätt av att göra optic flow som baseras i frekvensplanet.
Jag har bifogat två dokument, en liten förklaring av mig som beskriver hur phase correlation fungerar och ett dokument om en komplett optical flow algoritm.
kflow_v1.pdf
phasecorrelation5.pdf
Exempel - här är två bilder där den ena har skiftats 15 pixlar i x och y led:
pic1_fill.png
pic2_fill.png
Den svarta linjen motsvarar ett dödområde i sensorn.

Efter min algoritm och efter IFFTn så är detta resultatet:
ifft.png
Den vita punkten är i positionen (15, 15) - dvs perfekt matchning.


När det kommer till beräkningskomplexitet så behövs det (om bilden har NxN pixlar) 2*N FFTer samt lika många IFFTer, där max N stycken kan köras i parallell.
Dvs för en 256 x 256 bild så behövs det totalt 512 st 256 punkters FFTer och lika många IFFTer. Så denna algoritm är extremt bra för parallella beräkningar i tex en FPGA!

Här är ett script (bestående av 3 filer) som gör precis detta, men bra för translation. Dvs den tar inte hänsyn till rotation och skalning.
Men den är ganska kul att leka med. :)

Huvudscriptet:

Kod: Markera allt

close all;
clc;
clear all;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  Phase correlation of Images based motion estimation example
%            (uses a webcam to demo the algorithm)
%
%  Note: Only translation, not rotation nor scaling is identified.
%
%  By Emil Fresk, Luleå University of Technology
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


% Create video input object.
% Follow the steps here to install neccessary software:
% http://www.mathworks.se/help/imaq/basic-image-acquisition-procedure.html

% Work computer webcam:
% vid = videoinput('winvideo',1,'I420_176x144');
% Laptop webcam:
vid = videoinput('winvideo',1,'MJPG_352x288');

vid_size = 256;

% Set video input object properties for this application.
% Note that example uses both SET method and dot notation method.
set(vid,'TriggerRepeat',100);
vid.FrameGrabInterval = 4;

% Set value of a video source object property.
vid_src = getselectedsource(vid);
%set(vid_src,'Tag','motion detection setup');
%set(vid_src,'FrameRate', '20.0000');
%set(vid_src,'ExposureMode', 'manual');

% Create a figure window.
f = figure(1); 

% Start acquiring frames.
start(vid)

% Create local variables
old_fft = zeros(vid_size, vid_size);
x = 0;
y = 0;
first = true;

while (1)
    
    % Wait until a frame is available
    while(vid.FramesAvailable == 0)
    end

    % Get the new image from the webcam
    new_image = getdata(vid,1); 
    
    % Convert the data uint8 -> double
    new_image = double(new_image(1:vid_size, 1:vid_size, 1));
    
    % Calculate the optic flow based on the old fft and the new image
    [of, old_fft, dx, dy] = get_optic_flow(new_image, old_fft, vid_size);
    
    % Minor thing to cancel start up defects
    if first == true
        dx = 0;
        dy = 0;
        first = false;
    end
    
    % Integrate the deltas to get total translation
    x = x + dx;
    y = y - dy;
    
    % Plot the image and correlation in a subplot with results as text
    subplot(1,2,1), imshow(imresize(new_image ./ max(max(new_image)), 3));
    title(['x: ', int2str(x), ', y: ', int2str(y)])
   
    subplot(1,2,2), imshow(imresize(of, 3));
    title(['(dx: ', int2str(dx), ', dy: ', int2str(-dy), ')']);
    
    set(findall(f,'type','text'),'FontSize',30,'fontWeight','bold')    
    drawnow     % update figure window
    
    % Check if 'e' has been pressed, if so exit the loop.
    key = get(f,'CurrentCharacter');
    if (key == 'e')
        fprintf('End of flow.\n')
        break;
    end
end

stop(vid) 


Hjälpfunktioner:

Kod: Markera allt

function [A, new_fft, dx, dy] = get_optic_flow(new_img, old_fft, vid_size)
  D1 = old_fft;
  D2 = fft2(apply_window(new_img));
  
  M = D1.*conj(D2);
  A = abs(ifft2(M ./ abs(M)));
  A = fftshift(A ./ max(max(A)));
  
  [~, I] = max(A(:));
  
  dx = round(I / vid_size) - (vid_size / 2) - 1;
  dy = mod(I, vid_size) - (vid_size / 2) - 1;
  
  new_fft = D2;
end

Kod: Markera allt

function X = apply_window(img)
  % w - Window function, N x 1
  % d - Image N x N
  
  N = length(img);
  m = zeros(N,N); % Initialize space for mask
  
  w = hamming(N);

  % Initialize windows along column direction
  for n=1:N
    m(:,n) = w;
  end

  % Apply windows along rows
  m = m .* m';
  
  X = img .* m;
end
Har ni frågor så släng dom på mig! :D

Re: Korkens Optical Flow sensor

Postat: 11 september 2014, 20:22:46
av dar303
Herregud, jag har saknat EF när jag ägnat mig åt annat i nåt år...trådar som är så långt över ens huvud att man måste googla och läsa en timme för att få baskunskaper! :) Tack!