2011-07-31 46 views
2

這裏是衝浪的GPU代碼:cvShowImage("aa", frame);而是組成: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; 
} 

我們不frame_gpu得到正確的圖像,所以有問題,從frame越來越像,我們用印刷frameframe如果我們試圖image有剛黑屏

回答

13

這個構造函數中使用您的IplImage計數,然後將其轉換爲Mat(在C++):

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

所以,你會只是做:

Mat myMat(img);

這會使你的矩陣。您可以在程序的跟蹤部分使用它!

注意:數據不會被複制。但是,如果要複製數據,則可以將copyData參數設置爲true

+2

哎呦。我剛剛意識到這是2011年7月31日提出的。太晚了...... – eboix

+2

仍幫助我......乾杯。 ;) –