Introduction to OpenCV

A snippet in OpenCV for some useful mathematical operations. It mostly focuses on the old opencv style matrix to new opencv style matrix conversion (and vice-versa) and some elementary mathematical operations. It also includes a trivial matrix display function. I’ll give a more robust matrix display function in future.

// OpenCV_Test.cpp : Defines the entry point for the console application.
//

#include <stdio.h>
#include <opencv2\opencv.hpp>
#include <string>
#include <fstream>

using namespace std;

// I wrote this method to display matrix contents. It is only for
// double (64 bit) data type. I shall write a more general version
// in near future
void dispMat(CvMat *N, string varName){
    double *data = N->data.db;
    int rowNum = N->rows;
    int colNum = N->cols;

    printf("\n========= Matrix Display System ==============\n");
    printf("(%d,%d) %s \n",rowNum,colNum,varName.c_str());
    for(int i=0;i<rowNum;i++){
        if(colNum>10)
            printf("Row No=%d\n",i+1);
        for(int j=0;j<colNum;j++)
            printf("%0.2f\t",data[i*colNum+j]);
        printf("\n");
    }
    printf ("=================================================");
    printf("\n");
}

int main(int argc, char* argv[])
{
    int a=0;

    double c[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
    double d[] = {2,1,6,-4,0.5,4,9,1,9,-1,-0.3,0.7,3,2,1,1.5};

    // Declaring Matrix as a Pointer and initialization
// This is the old style of OpenCV Matrices
    CvMat* M = cvCreateMat(4,4,CV_64FC1);
    cvInitMatHeader(M,4,4,CV_64FC1,d);
    dispMat(M,"M = ");

    // Declaring Matrix as variable and initialization
    CvMat N = cvMat(4,4,CV_64FC1,c);
    dispMat(&N,"N = ");

    // Declaring Matrix as pointer without initialization
    CvMat* M2;

    //Cloning a Matrix
    M2 = cvCloneMat(M);
    dispMat(M2,"M2 = ");

    //indirect access to matrix element
    //get
    printf("\n(2,3)th element in M2 = %0.2f\n",cvmGet(M2,2,3));
    //set
    cvmSet(M2,2,3,90);
    printf("(2,3)th element is now set to = %0.2f\n",
	cvmGet(M2,2,3));

    cout<<"\nPress Enter to continue\n";cin.get();
    // ================================================

    //Set zero
    cvSetZero(M2);
    dispMat(M2,"\nM2 (cvSetZero)\n");

    //Set Identity
    cvSetIdentity(M2);
    dispMat(M2,"\nM2 (cvSetIdentity)\n");

	cout<<"\nPress Enter to continue\n";cin.get();

    // ============ OpenCV 2 Test =====================
    cv::Mat A = cv::Mat(M,true);
    cv::Mat J = cv::Mat(4,1,CV_64FC1,cv::Scalar(1));

    cv::Mat B = (J.t())*(A);

    CvMat AA = A;
    dispMat(&AA,"OpenCV 2 Variable: A");

    AA = J;
    dispMat(&AA,"OpenCV 2 Variable: J");

	// Try this: B  = (J.t()*A).t();
    B  = (J.t()*A);
	B = B.t();
	AA = B;		// Also try this: AA = B.t();
    dispMat(&AA,"OpenCV 2 Variable:(J'*A)'");

    cout<<"\nPress Enter to continue\n";cin.get();
    // =========== Predefined openCV 2 Matrices ========
    A = cv::Mat::zeros(5,2,CV_64FC1);
    AA = A;
    dispMat(&AA,"Predefined matrices: zeros(5,2,cv_64fc1)");

    A = cv::Mat::ones(5,2,CV_64FC1);
    AA = A;
    dispMat(&AA,"Predefined matrices: ones(5,2,cv_64fc1)");

    A = cv::Mat::eye(5,5,CV_64FC1);
    AA = A;
    dispMat(&AA,"Predefined matrices: eye(5,5,cv_64fc1)");

    cout<<"\nPress Enter to continue\n";cin.get();
    // =========== Predefined openCV 2 Matrices ========
    printf("\n\n Element (1,2) = %f",A.at<double>(2,1));

    // === Writing opencv Matrix (M2) to and from Filestream =====

    ofstream ofs("d:\\test.dat",ios::out|ios::binary);

    dispMat(M2,"Matrix before writing to file");

    double p =5;int s=3;
    double* m2Dat = M2->data.db;

    ofs<<p<<endl<<s;
    ofs.write((char *) m2Dat,M2->cols*M2->rows*sizeof(double));

    ofs.close();

    p=0;s=0;
    m2Dat[0]=-1;
    m2Dat[1]=-1;
    m2Dat[2]=-1;
    m2Dat[3]=-1;
    m2Dat[4]=-1;
    m2Dat[5]=-1;
    m2Dat[6]=-1;
    m2Dat[7]=-1;
    m2Dat[8]=-1;
    m2Dat[9]=-1;
    m2Dat[10]=-1;
    m2Dat[11]=-1;
    m2Dat[12]=-1;
    m2Dat[13]=-1;
    m2Dat[14]=-1;
    m2Dat[15]=-1;

    dispMat(M2,"Matrix after changing data");

    ifstream ifs("d:\\test.dat",ios::in|ios::binary);

    ifs>>p>>s;
    printf("%0.3f\n",p);
    printf("%d\n",s);
    ifs.read((char *)m2Dat,M2->cols*M2->rows*sizeof(double));

    dispMat(M2,"Matrix after Loading again");

    CvMat* M3 = cvCreateMat(4,4,CV_64FC1);
    cvInitMatHeader(M3,4,4,CV_64FC1,m2Dat);
    dispMat(M3,"Matrix reading from file");

    ifs.close();

    // Releasing Matrix Handle
    cvReleaseData(M);
    cvReleaseData(M2);
    cvReleaseData(M3);

    return 0;
}

Note: This post assumes you have OpenCV 2.3 installed. If not, please check the following post
http://www.itanveer.com/2011/installing-opencv-231/

Share on Twitter

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>