Convert IplImage to CvMat

28,997

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

Share:
28,997
Sameer Bagga
Author by

Sameer Bagga

Updated on December 28, 2020

Comments

  • Sameer Bagga
    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 from frame,we printed frame using: cvShowImage("aa", frame); but instead of frame if we try image there is just blank screen

  • Rhys van der Waerden
    Rhys van der Waerden over 10 years
    Still helped me... Cheers. ;)