Passing a List as a parameter to a Matlab function from C# project

271 views Asked by At

I'm trying to run The Fast Compressive Tracking Algorithm from my C# project. What I want is that, (in C#)to pass the images after converting them into gray scale images to the Matlab function

  Runtracker 

instead of having the images in the Matlab code as I'm going to apply some operations to specify the index of the array that containing the images to start tracking from.
But when I pass the list of the grayscale images, I got an error says

" The best overload method match for 'trackerNative.FCT.Runtracker(int)' has some invalid arguments."

Can you help me solve this? to pass List of images in C# to a matlab function.

C# Code

  //to convert to graScale
    public double[,] to_gray(Bitmap img)
    {
        int w = img.Width;
        int h = img.Height;

        double[,] grayImage = new double[w, h];

        for (int i = 0; i < w; i++)
        {
            for (int x = 0; x < h; x++)
            {
                Color oc = img.GetPixel(i, x);
                grayImage[i, x] = (double)(oc.R + oc.G + oc.B) / 3;
            }
        }
        return grayImage;
    }


    //to get the files from specified folder
    public static String[] GetFilesFrom(String searchFolder, String[] filters, bool isRecursive)
    {
        List<String> filesFound = new List<String>();
        var searchOption = isRecursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly;
        foreach (var filter in filters)
        {
            filesFound.AddRange(Directory.GetFiles(searchFolder, String.Format("*.{0}", filter), searchOption));
        }
        return filesFound.ToArray();
    }


    //Button to run the matlab function 'Runtracker'
    private void button1_Click(object sender, EventArgs e)
    {
        FCT obj = new FCT();  //FCT is a matlab class

        OpenFileDialog openFileDialog1 = new OpenFileDialog();

        if (openFileDialog1.ShowDialog() == DialogResult.OK)
        {

            string file_path = openFileDialog1.FileName;

            var filters = new String[] { "png" };
            var files = GetFilesFrom(file_path, filters, false);
            List< double[,] > imgArr = new List< double[,] >();

            for (int i = 0; i < files.Length; i++)
            {
                Bitmap image = new Bitmap(files[i]);

                double[,] grayScale_image = to_gray(image);

                imgArr[i] = grayScale_image;                     
            }



            object m = obj.Runtracker(imgArr);  //the error occured 

            //Bitmap output = m as Bitmap; 

        }
    }

Matlab Code

    function Runtracker(input_imgArr)

    clc;clear all;close all;
    rand('state',0); 
    %%  

    [initstate] = initCt(1);% position of the detected face in the 1st frame

    num = length(input_imgArr);% number of frames
    %%
    x = initstate(1);% x axis at the Top left corner
    y = initstate(2);
    w = initstate(3);% width of the rectangle
    h = initstate(4);% height of the rectangle
    %---------------------------

    img = imread(input_imgArr(1));

    img = double(img);
    %% 
    trparams.init_negnumtrain = 50;%number of trained negative samples
    trparams.init_postrainrad = 4;%radical scope of positive samples
    trparams.initstate = initstate;% object position [x y width height]
    trparams.srchwinsz = 25;% size of search window
    %-------------------------
    %% Classifier parameters
    clfparams.width = trparams.initstate(3);
    clfparams.height= trparams.initstate(4);
    % feature parameters
    % number of rectangle from 2 to 4.
    ftrparams.minNumRect =2;
    ftrparams.maxNumRect =4;
    M = 100;% number of all weaker classifiers, i.e,feature pool
    %-------------------------
    posx.mu = zeros(M,1);% mean of positive features
    negx.mu = zeros(M,1);
    posx.sig= ones(M,1);% variance of positive features
    negx.sig= ones(M,1);

    lRate = 0.85;% Learning rate parameter
    %% Compute feature template
    [ftr.px,ftr.py,ftr.pw,ftr.ph,ftr.pwt] = HaarFtr(clfparams,ftrparams,M);

    %% Compute sample templates
    posx.sampleImage = sampleImgDet(img,initstate,trparams.init_postrainrad,1);
    negx.sampleImage =     sampleImg(img,initstate,1.5*trparams.srchwinsz,4+trparams.init_postrainrad,trpar ams.init_negnumtrain);

    %% Feature extraction
    iH = integral(img);%Compute integral image
    posx.feature = getFtrVal(iH,posx.sampleImage,ftr);
    negx.feature = getFtrVal(iH,negx.sampleImage,ftr);
    [posx.mu,posx.sig,negx.mu,negx.sig] =  
    classiferUpdate(posx,negx,posx.mu,posx.sig,negx.mu,negx.sig,lRate);%     
    update distribution parameters

    %% Begin tracking
    for i = 2:num
    img = imread(input_imgArr(i));
    imgSr = img;% imgSr is used for showing tracking results.

    img = double(img); 
    iH = integral(img);%Compute integral image

    %% Coarse detection
    step = 4; % coarse search step
    detectx.sampleImage = 
    sampleImgDet(img,initstate,trparams.srchwinsz,step);    
    detectx.feature = getFtrVal(iH,detectx.sampleImage,ftr);
    r = ratioClassifier(posx,negx,detectx.feature);% compute the classifier for all samples
    clf = sum(r);% linearly combine the ratio classifiers in r to the final classifier
    [c,index] = max(clf);
    x = detectx.sampleImage.sx(index);
    y = detectx.sampleImage.sy(index);
    w = detectx.sampleImage.sw(index);
    h = detectx.sampleImage.sh(index);
    initstate = [x y w h];

    %% Fine detection
    step = 1;
    detectx.sampleImage = sampleImgDet(img,initstate,10,step);    
    detectx.feature = getFtrVal(iH,detectx.sampleImage,ftr);
    r = ratioClassifier(posx,negx,detectx.feature);% compute the classifier for all samples
    clf = sum(r);% linearly combine the ratio classifiers in r to the final classifier
    [c,index] = max(clf);
    x = detectx.sampleImage.sx(index);
    y = detectx.sampleImage.sy(index);
    w = detectx.sampleImage.sw(index);
    h = detectx.sampleImage.sh(index);
    initstate = [x y w h];
    %% Show the tracking results
    imshow(uint8(imgSr));
    rectangle('Position',initstate,'LineWidth',4,'EdgeColor','r');
    hold on;
    text(5, 18, strcat('#',num2str(i)), 'Color','y', 'FontWeight','bold', 'FontSize',20);
    set(gca,'position',[0 0 1 1]); 
    pause(0.00001); 
    hold off;

    %% Extract samples 
    posx.sampleImage = sampleImgDet(img,initstate,trparams.init_postrainrad,1);
    negx.sampleImage =   
  sampleImg(img,initstate,1.5*trparams.srchwinsz,4+trparams.init_postrainrad,trparams.init_negnumtrain);

    %% Update all the features
    posx.feature = getFtrVal(iH,posx.sampleImage,ftr);
    negx.feature = getFtrVal(iH,negx.sampleImage,ftr); 
    [posx.mu,posx.sig,negx.mu,negx.sig] =     classiferUpdate(posx,negx,posx.mu,posx.sig,negx.mu,negx.sig,lRate);% update   distribution parameters  
    end
    end
1

There are 1 answers

2
Dhrumil On

This is because the Runtracker expects an argument of type int as per the error and you are passing an argument of type int[] i.e an integer array.

The passed parameter and the expected parameter should match in order to execute the method successfully.

Hope this helps.