前言
这是我《OpenCV:从零到一》专栏的第二篇博客,想看跟多请戳这。
本文概要
CV_Assert()
saturate_cast()
filter2D()
Mat对象的rows,cols,channels,depth(),copyTo(),ptr()
getTickCount() getTickFrequency()
图像的遍历
掩膜(mask也称为kennel),在数字图像处理中对应的就是模板运算,是处理图像常用的运算。说白了就是将某个像素的附近的像素的灰度值进行加权运算得到的值再赋给这个像素。实现方法有两种:1.两层循环遍历 2.调用函数
案例代码
大概内容:两种矩阵的掩膜操作。计时操作
#include<opencv2/opencv.hpp>//包含了大多数头文件
#include<opencv2/highgui/highgui_c.h>
#include<iostream>
using namespace cv;
//main的参数可填可不填,主要用于命令行执行函数的时候输入
int main(int argc, char** argv) {
String pic_url = "D:\\86186\\Documents\\opencv\\lena.jpg";
Mat myImage = imread(pic_url);
CV_Assert(myImage.depth() == CV_8U);//宏 判断语句是否正确,错误抛出异常,判断图片是否为8bit无符号类型
namedWindow("LENA", CV_WINDOW_AUTOSIZE);//CV_WINDOW_AUTOSIZE要#include<opencv2/highgui/highgui_c.h>
imshow("LENA", myImage);
//方法一:
Mat resultImage;
myImage.copyTo(resultImage);//函数本身作用是复制,这里主要是为了给resultImage分配空间
int nchannels = myImage.channels();//Returns the number of matrix channels.返回矩阵通道数
int height = myImage.rows;//Mat的属性,像素矩阵的行数
int cols = myImage.cols;//Mat的属性,像素矩阵的列数
int width = myImage.cols * nchannels;//可以认为一个像素是由一个一维数组,数组长度为通道数,即实际矩阵长度要乘上矩阵
double t1 = (double)getTickCount();//获取开始时间信息
for (int row = 1;row < height - 1;row++) {
//myImage.ptr<uchar>(int)是一个函数模板,看到<>应该想到模板,看到()应该想到函数.
//下面每次循环都会声明这几个变量,在下一次循环之前会被销毁
const uchar* previous = myImage.ptr<uchar>(row - 1);//返回值是一个一级指针,或者说是一个一维数组
const uchar* current = myImage.ptr<uchar>(row);
const uchar*