当前位置:编程学习 > C/C++ >>

OpenCV的几个小技巧

申明:以下的小技巧,均为OpenCV2.4.2下验证过的,但并不保证其它版本依然奏效
 
 
(1)利用数组来构建cv::Mat
 
   示例代码如下所示:
 
[cpp]  
void ArrayToMat()  
{  
    double m[3][3];  
    for (int i=0; i<3; i++)  
    {  
        for (int j=0; j<3; j++)  
        {  
            m[i][j] = i+j;  
            cout<<m[i][j]<<" ";  
        }  
        cout<<endl;  
    }  
    cout<<"****************************************"<<endl;  
  
    Mat M = Mat(3, 3, CV_64F, m);  
    double tempVal = 0.0;  
  
    for (int i=0; i<3; i++)  
    {  
        for (int j=0; j<3; j++)  
        {  
            tempVal = M.at<double>(i,j);  
            cout<<tempVal<<" ";  
        }  
        cout<<endl;  
    }  
}  
不出意外的话,执行结果应该如下所示:
 
(2) IplImage*跟cv::Mat之间的互相转换
 
示例代码:
 
[cpp] 
void IplImageToMat()  
{  
    IplImage* pImg = cvLoadImage("c:/test.jpg");  
    if (!pImg)  
    {  
        cout<<"pImg load error"<<endl;  
        system("pause");  
        exit(-1);  
    }  
  
    cvNamedWindow("pImg", 0);  
    cvNamedWindow("mtx", 0);  
      
    Mat mtx(pImg);   
      
    cvShowImage("pImg", pImg);  
    imshow("mtx", mtx);  
    cvWaitKey(0);  
  
    cvReleaseImage(&pImg);  
}  
笔者任意加载了电脑上一副图片,结果如下所示:
 
\
提醒,这里的格式转换并不申请新的内存,而仅仅是改变数据结构而已
 
(3)Mat转换为IplImge
 
示例代码:
 
[cpp]  
void MatToIplImage()  
{  
    Mat m = imread("c:/test.jpg");  
    if (m.empty())  
    {  
        cout<<"mat load error"<<endl;  
        system("pause");  
        exit(-1);  
    }  
  
    IplImage img1 = IplImage(m);  
    IplImage img2 = m;  
  
    cvNamedWindow("img1", 0);  
    cvNamedWindow("img2", 0);  
  
    cvShowImage("img1", &img1);  
    cvShowImage("img2", &img2);  
  
    cvWaitKey(0);  
}  
笔者任意加载一张图片,上述代码的执行结果为:
\
 
(4)访问二维数据(cv::Mat)最高效的方式是先得到该二维数据的每一行的指针,然后利用下标运算符逐列访问
 
示例代码:
 
[cpp]  
void MatAccess()  
{  
    double m[3][3];  
    for (int i=0; i<3; i++)  
    {  
        for (int j=0; j<3; j++)  
        {  
            m[i][j] = i+j;  
            cout<<m[i][j]<<" ";  
        }  
        cout<<endl;  
    }  
    cout<<"****************************************"<<endl;  
  
    Mat M = Mat(3, 3, CV_64F, m);  
    double sum = 0;  
    int rows = M.rows;  
    int cols = M.cols;  
  
    for (int i=0; i<rows; i++)  
    {  
        const double* Mi = M.ptr<double>(i);  
        for (int j=0; j<cols; j++)  
        {  
            sum += Mi[j];  
        }  
    }  
    cout<<"sum: "<<sum<<endl;  
}  
上面的代码执行结果为:
 
(5)cv::Mat支持STL中的迭代器功能
 
示例代码:
 
[cpp]  
void MatAccess()  
{  
    double m[3][3];  
    for (int i=0; i<3; i++)  
    {  
        for (int j=0; j<3; j++)  
        {  
            m[i][j] = i+j;  
            cout<<m[i][j]<<" ";  
        }  
        cout<<endl;  
    }  
    cout<<"****************************************"<<endl;  
  
    Mat M = Mat(
补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,