opencv学习 2.Mat类图像遍历

图像的遍历

原图

1.简单存取像素值

代码如下:

// Mat类图像遍历.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
using namespace std;
using namespace cv;

int _tmain(int argc, _TCHAR* argv[])
{
    Mat img=imread("1.jpg");
    Size size=Size(600,400);
    resize(img,img,size);
//遍历方式
    //1   简单存取像素值
    switch(img.channels())
{
    case 1:
    {for(int i=0;i<img.rows;i++)
      {
        for(int j=0;j<img.cols;j++)
            {
                img.at<uchar>(i,j)=0;
            }
       }
    break;
     }
    case 3:
    {
        for(int i=0;i<img.rows;i++)
        {
            for(int j=0;j<img.cols;j++)
            {
                img.at<Vec3b>(i,j)[0]=0;
                img.at<Vec3b>(i,j)[1]=0;
            }
        }
    break;
    }
}

    namedWindow("celtics",1);
    imshow("celtics",img);
    waitKey(0);
    return 0;
}

由于opencv颜色顺序为BGR

将前面两种颜色置0,得到红色分量。

结果如下:

2.指针遍历

// Mat类图像遍历.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
using namespace std;
using namespace cv;

int _tmain(int argc, _TCHAR* argv[])
{
    Mat img=imread("1.jpg");
    Size size=Size(600,400);
    resize(img,img,size);
//遍历方式
//    2   指针
    int nrows=img.rows;
    int ncols=img.cols*img.channels();
    if(img.isContinuous())
    {
       ncols*=nrows;
       nrows=1;
    }
    uchar *data;
          for(int j=0;j<nrows;j++)
          {   data=img.ptr<uchar>(j);
              for(int i=0;i<ncols;i+=3)
              {
                 data[i]=0;
                 data[i+1]=0;
              }
          }

    namedWindow("celtics",1);
    imshow("celtics",img);
    waitKey(0);
    return 0;
}

同样将B、G分量置0,得到红色分量。

结果如下:

3.迭代器

时间: 2024-12-09 13:34:50

opencv学习 2.Mat类图像遍历的相关文章

opencv学习笔记(03)——遍历图像(迭代器法)

1 #include <opencv2\highgui\highgui.hpp> 2 #include <opencv2\imgproc\imgproc.hpp> 3 #include <opencv2\core\core.hpp> 4 5 void colorReduce(cv::Mat& img, int div=64); 6 7 8 int main() 9 { 10 cv::Mat img_orginal = cv::imread("F:\\i

opencv学习笔记(02)——遍历图像(指针法)

#include <opencv2\core\core.hpp> #include <opencv2\highgui\highgui.hpp> #include <opencv2\imgproc\imgproc.hpp> #include <iostream> void colorReduce(cv::Mat& image, int div=64) { int nr = image.rows; int nc = image.cols * image.

OpenCV学习(3)--Mat矩阵的操作

CvMat的矩阵结构 1 typedef struct CvMat 2 { 3 //矩阵中元素的类型 4 int type; 5 //行数据长度 6 int step; 7 8 /* for internal use only */ 9 int* refcount; 10 int hdr_refcount; 11 12 //指向数据的指针 13 union 14 { 15 uchar* ptr; 16 short* s; 17 int* i; 18 float* fl; 19 double* d

opencv学习(5)图像像素的访问、颜色通道的分离和融合

代码都是源于毛星云的<opencv3.0编程入门> 1.计时函数 getTickCount()和getTickFrequency()函数: getTickCount()函数返回CPU自某个事件以来走过的时钟周期: getTickFrequency()函数 返回CPU一秒所走的周期数: 事例: double time0=static_cast< double>(getTickCount()); //记录起始时间 // 事件的处理操作 time0=((double)getTickCou

OpenCV学习:Mat结构中的数据共享机制

使用Mat类,内存管理变得简单,不再像使用IplImage那样需要自己申请和释放内存. Mat是一个类,由两个数据部分组成:矩阵头(包含矩阵尺寸,存储方法,存储地址等信息)和一个指向存储所有像素值的矩阵的指针. 矩阵头的尺寸是常数值,但矩阵本身的尺寸会依图像的不同而不同,通常比矩阵头的尺寸大数个数量级. 复制矩阵数据往往花费较多时间,因此除非有必要,不要复制大的矩阵. 为了解决矩阵数据的传递,OpenCV使用了引用计数机制.其思路是让每个Mat对象有自己的矩阵头信息,但多个Mat对象可以共享同一

6、【opencv入门】Mat类介绍,基本的绘图函数

一.Mat类 1.Mat类的创建 1 Mat img;//创建无初始化矩阵 2 Mat img1(200,100,CV_8UC1);//200行,100列(长200,宽100) 3 Mat img2(Size(200,100),CV_8UC3,Scalar(0,255,0));//长100,宽200 4 Mat img3(200,100,CV_8UC3,Scalar(0,255,0));//创建200行,100列的8位三通道矩阵 5 Mat img4(200,100,CV_8UC1,Scalar

OPENCV学习笔记12_扫描图像并访问相邻像素

To illustrate this recipe, we will apply a processing function that sharpens an image(锐化图像的处理函数). This time, the processing cannot be accomplished in-place. Users need to provide an output image. The image scanning(扫描)is done using three pointers, on

OPENCV学习笔记2-8_Mat_类

在读取矩阵元素以及获取矩阵某行的地址时,需要指定数据类型. 如果使用Mat_类,就可以在变量声明时确定元素的类型,访问元素时不再需要指定元素类型,这样使代码简洁,又减少了出错的可能性. #include <iostream> #include "opencv2/opencv.hpp" #include <stdio.h> using namespace std; using namespace cv; int main( int argc, char* argv

OPENCV学习笔记1-8_选取图像局部区域

#include <iostream> #include "opencv2/opencv.hpp" #include <stdio.h> using namespace std; using namespace cv; int main( int argc, char* argv[] ) { Mat A = Mat::eye(6, 6, CV_32S); Mat B = A.row(2); //get second row Mat C = 3*A.col(2);