Convert IplImage to CvMat
Solution 1
Use your IplImage
for counting, and then convert it to a Mat
(in C++) with this constructor:
Mat(const IplImage* img, bool copyData=false);
So you would just do:
Mat myMat(img);
That would make your matrix. You would use it in the tracking section of your program!
NOTE: Data is not copied. You can set the copyData
parameter to true
, though, if you want data to be copied.
Solution 2
Try something like this:
IplImage* frame;
// here load your frame with some image
// convert to cv::Mat and show the converted image
cv::Mat image(frame);
cv::imshow("Image Window", image)
That's how IplImage can be converted to cv::Mat and displayed.
For conversion to and from cvMat, you will find all the details here:
http://wangpengnorman.blogspot.com/2009/06/transform-between-cvmat-and-iplimage.html
Sameer Bagga
Updated on December 28, 2020Comments
-
Sameer Bagga over 3 years
Here is the gpu surf code:
#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; }
We don't get correct image in
frame_gpu
,so there is problem in getting image fromframe
,we printedframe
using:cvShowImage("aa", frame);
but instead offrame
if we tryimage
there is just blank screen -
Rhys van der Waerden over 10 yearsStill helped me... Cheers. ;)