Opencv学习——图像及视频读取

Opencv的图像读取有CC++接口的,由于C接口涉及到指针操作,需要对指针进行管理。而C++接口就比较简单了,本文也主要以C++接口来进行图像操作。Opencv2.0版本后新增了Mat操作,相比之前的版本简单了很多。读取一张图片的函数类似于matlab的方式。

//图像读取
#include 
#include 

using namespace std;
using namespace cv;

int main()
{
    Mat img = imread("lena.jpg",1);
    if(img.empty())
    {
        cout<<"Cannot open the image!"<

在opencv中图像通道的顺序为BGR。图像像素操作一般有三种方法,考虑到效率的问题还是C风格的指针操作比较高效,函数isContinuous()将图像转化为单行形式,这样能够加速浏览过程。

Mat& ScanImageAndReduceC(Mat &I, const uchar* const table)
{
    //accept only char type matrices
    CV_ASSERT(I.depth()!=sizeof(uchar));
 
    int channels = I.channels();
    int nRows = I.rows;
    int nCols = I.cols*channels;
 
    if(I.isContinuous())
    {
        nCols *=nRows;
        nRows = 1;
    }

    int i,j;
    uchar* p;
    for(i=0;i(i);
        for(j=0;j
迭代方法是比较安全的方法:

Mat& ScanImageAndReduceIterator(Mat& I, const uchar* const table)
{
    //accept only char type matrices
    CV_ASSERT(I.depth()!=sizeof(uchar));
    
    Const int channels = I.channels();
    Switch(channels)
    {
        case 1: //单通道
        {
            MatIterator_ it, end;
            for(it = I.begin(),end = I.end();it!=end;++it)
                *it = table[*it];
            
            break;
        }
        case 3: //3通道
        {
            MatIterator_ it, end;
            for(it = I.begin(),end = I.end();it!=end;++it)
            {
                (*it)[0] = table[(*it)[0]];
                (*it)[1] = table[(*it)[1]];
                (*it)[2] = table[(*it)[2]];
            }
            break;
        }
    }
    return I;
}
 最后是不太推荐的图像扫描方式,只适合获取或更改图像中的随机像素,使用的是at()函数:

Mat& ScanImageAndReduceRandomAccess(Mat& I, const uchar* const table)
{
//accept only char type matrices
    CV_ASSERT(I.depth()!=sizeof(uchar));
    
    Const int channels = I.channels();
    Switch(channels)
    {
        case 1: //单通道
        {
            for(int i=0;i(i,j) = table[I.at(i,j)];
            break;
        }
        case 3: //3通道
        {
            Mat_ _I = I;
            for(int i=0;i
读取图片比较简单,从摄像机读取视频则稍微复杂一点://读取视频
//读取视频
int main(int,char**)
{
    VideoCapture cap(0);
    if(!cap.isOpened())
    {
        cout<<"Cannot Open the camera!"<
将VideoCapture cap(0)改为VideoCapture cap("camera.avi"),即可读取本地视频。以上是opencv读写图像及视频的简介。





你可能感兴趣的:(opencv)