opencv projectPoints error

asked 2013-07-25 16:02:42 -0500

seifullaah73 gravatar image

updated 2013-07-25 16:03:52 -0500

Hi guys

I'm trying to find a way to project a 3D point onto a 2D silhouette image.

I am using projectPoints and the parameters obtained from the calibratecamera functions.

I get the following error when it tries to execute the projectpoints function

OpenCV Error: Assertion failed (0 <= i && i < (int)v.size()) in unknown function file ...... \matrix.cpp, line 981.

below is my code

#include<vector>
#include<opencv\cv.h>
#include<opencv\highgui.h>
#include<opencv2/imgproc/imgproc.hpp>
#include<cstdlib>
#include<iostream>
#include<cmath>

#include"reconstruction.h"

using namespace cv;
using namespace std;

int main()
{
    Mat image, grayscale;
    int numcorners, horcorner,vercorner;
    Mat icovar;
    Scalar meanmat;
    int k=1;
    //covariance for dark combined
    double covar[3][3]={{180.1437, 180.8316, 179.0236},{188.8316,355.5152,238.8029},{179.0236,238.8029,267.9239}};
    meanmat[0]=13.8340;
    meanmat[1]=68.3459;
    meanmat[2]=22.7451;

    Mat covmat(3,3,CV_64F,covar);

    Mat mask = Mat::zeros(480, 640, CV_8UC1);   //create matrix same size as image which is 480 by 640 based on the webcam capture
    //intitialize capture
    Vec3b pixel;
    double distance = 200;
    double mdist=0;
    float x,y,z;

    icovar=inversemat(covmat);      //determinant of covariance matrix is zero. SOLVED

    Mat corners;
    printf("Enter number of corners horizontally: ");
    scanf("%d", &horcorner);
    printf("Enter number of corners vertically: ");
    scanf("%d", &vercorner);
    numcorners=horcorner*vercorner;

    vector<vector<Point3f>> object_points;
    vector<vector<Point2f>> image_points;

    vector<Point3f> obj;
    vector<Point2f> img;

    vector<Point3f> threedpoint;
    vector<Point2f> projectedpoints;

    Mat intrinsic = Mat(3, 3, CV_32FC1);
    Mat distCoeffs;
    vector<Mat> rvecs;
    vector<Mat> tvecs;
    intrinsic.ptr<float>(0)[0] = 1;
    intrinsic.ptr<float>(1)[1] = 1;

    printf("Enter the distance between the two marked corners in the x direction (mm): ");
    scanf("%f",&x);
    printf("Enter the distance between the two marked corners in the y direction (mm): ");
    scanf("%f",&y);
    printf("Enter the height of the object (mm): ");
    scanf("%f",&z);

    int sz[] = {x,y,z};

    Mat threedimension(3,sz,CV_32F,Scalar::all(1));  //create 3dim matrix, type 32 filled with 1s.

    VideoCapture webcam;
    webcam.open(-1);    
    while(1)
    {
        //copy webcam stream to image
        webcam>>image;
        if(!webcam.isOpened())
        {
            cout<<"\nThe Camera is being used by another application, make sure all applications using the camera are closed and try running this program again."<<endl;
            break;
        }
        for(int i = 0; i < image.rows;i++)
        {
            for(int j=0; j<image.cols;j++)  //in case it fails changed it from i=1 to i=0
            {
                pixel= image.at<Vec3b>(i,j);    //prints wierd characters
                mdist=mahadistance(icovar,meanmat,pixel);
                if(mdist<distance)
                    mask.at<uchar>(i,j)=255;
                else
                    mask.at<uchar>(i,j)=0;
            }
        }
        cvtColor(image,grayscale,CV_BGR2GRAY);
        //goodfeatures(grayimage, output to store corners, quality factor, distance factor)
        goodFeaturesToTrack(grayscale,corners,numcorners,0.1,100);   //good so far 0.1 and 100 also 0.01 and 100 a little ok i chose this
        // Mark these corners on the original image
        cornerSubPix(grayscale, corners, Size(11, 11), Size(-1, -1), TermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 30, 0.1 ...
(more)
edit retag flag offensive close merge delete