opencv projectPoints error [closed]
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 ...