2011-07-31 7 views
2

Voici le code de surf gpu:Convertir IplImage à CvMat

#include <iostream> 
#include <iomanip> 
#include "opencv2/contrib/contrib.hpp" 
#include "opencv2/objdetect/objdetect.hpp" 
#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include <opencv2/imgproc/imgproc_c.h> 
#include "opencv2/gpu/gpu.hpp" 
#include "opencv2/core/core.hpp" 
#include "opencv2/features2d/features2d.hpp" 

using namespace std; 
using namespace cv; 
using namespace cv::gpu; 

void help() 
{ 
cout << "\nThis program demonstrates using SURF_GPU features detector, descriptor extractor and BruteForceMatcher_GPU" << endl; 
cout << "\nUsage:\n\tmatcher_simple_gpu <image1> <image2>" << endl; 
} 
int main(int argc, char* argv[]) 
{ 

GpuMat img1(imread("C:\\OpenCV2.3\\opencv2.3\\bin\\Debug\\tsucuba_left.png", CV_LOAD_IMAGE_GRAYSCALE)); 
SURF_GPU surf; 
// detecting keypoints & computing descriptors 
GpuMat keypoints1GPU, keypoints2GPU; 
GpuMat descriptors1GPU, descriptors2GPU; 
surf(img1, GpuMat(), keypoints1GPU, descriptors1GPU); 

cout << "FOUND " << keypoints1GPU.cols << " keypoints on first image" << endl; 
//cout << "FOUND " << keypoints2GPU.cols << " keypoints on second image" << endl; 
CvCapture* capture = cvCaptureFromCAM(0); 
int frame_width = (int) cvGetCaptureProperty(capture, 320); 
int frame_height = (int) cvGetCaptureProperty(capture, 240); 
cout<<"frames done\n"; 
GpuMat frame_gpu = GpuMat(frame_width, frame_height, CV_8UC3); 
GpuMat frame_gpu_cvt = GpuMat(frame_width, frame_height, CV_8UC1); 
cout<<"gpu frmes loaded\n"; 

IplImage* frame; 
while(1) 
{ 
frame =cvQueryFrame(capture); 
CvMat* image = cvCreateMat(frame->height, frame->width, CV_8UC1); 
/*CvMat* image = cvCreateMatHeader(frame->height, frame->width, CV_8UC1); 
image->step = 4 * (image->cols * CV_ELEM_SIZE1(image->type) * CV_MAT_CN(image->type)/4 + 1);//critical 
cvCreateData(image);*/ 
cvInitMatHeader(image, frame->width, frame->height, CV_8UC1,frame->imageData); 
// cvConvert(frame, image); 
//cvCvtColor(frame, image, CV_RGB2GRAY); 
cvConvertImage(frame, image, CV_RGB2GRAY); 
namedWindow("aa", 1); 
cvShowImage("aa", frame); 
frame_gpu.upload(image); 
cout<<"frame uploaded\n"; 
surf(frame_gpu, GpuMat(), keypoints2GPU, descriptors2GPU); 
cout<<"surf done\n"; 
// matching descriptors 
BruteForceMatcher_GPU< L2<float> > matcher; 
GpuMat trainIdx, distance; 
matcher.matchSingle(descriptors1GPU, descriptors2GPU, trainIdx, distance); 
cout<<"match done\n"; 
// downloading results 
vector<KeyPoint> keypoints1, keypoints2; 
vector<float> descriptors1, descriptors2; 
vector<DMatch> matches; 
surf.downloadKeypoints(keypoints1GPU, keypoints1); 
surf.downloadKeypoints(keypoints2GPU, keypoints2); 
surf.downloadDescriptors(descriptors1GPU, descriptors1); 
surf.downloadDescriptors(descriptors2GPU, descriptors2); 
BruteForceMatcher_GPU< L2<float> >::matchDownload(trainIdx, distance, matches); 
// drawing the results 
Mat img_matches; 
drawMatches(img1, keypoints1, frame_gpu, keypoints2, matches, img_matches); 
cout<<"match done\n"; 
namedWindow("matches", 1); 
imshow("matches", img_matches); 
cvReleaseMat(&image); 
frame_gpu.release(); 
cvReleaseImage(&frame); 
img_matches.release(); 
cout<<"deallocation done\n"; 
waitKey(0); 
} 
cvReleaseCapture(&capture); 
cout<<"work done"; 
return 0; 
} 

Nous ne recevons pas l'image correcte frame_gpu, donc il y a un problème à obtenir l'image de frame, nous imprimions frame utilisant: cvShowImage("aa", frame); mais au lieu de frame si nous essayons image il y a juste écran vide

Répondre

13

Utilisez votre IplImage pour le comptage, puis le convertir en un Mat (en C++) avec ce constructeur:

Mat(const IplImage* img, bool copyData=false);

donc vous suffit de faire:

Mat myMat(img);

Cela ferait votre matrice. Vous l'utiliserez dans la section de suivi de votre programme!

REMARQUE: Les données ne sont pas copiées. Vous pouvez cependant définir le paramètre copyData sur true si vous souhaitez que les données soient copiées.

+2

Oups. Je viens de me rendre compte que cela a été demandé le 31 juillet 2011. Trop tard ... – eboix

+2

Encore m'a aidé ... A bientôt. ;) –