1--代码
# include<cstdio>
# include"opencv2/opencv.hpp"
using namespace cv;
void PrintMs(const char *test = ""){
static long long last = 0;
long long cur = getTickCount(); // 当前调用的时刻
if(last == 0){
last = cur;
return;
}
long long ms = 0;
ms = ((double)(cur - last) / getTickFrequency()) * 1000;
if(*test != 0){
printf("%s = %lld ms\n", test, ms);
}
last = getTickCount(); // 上一次调用的时刻
}
int main(int argc, char *argv[]){
Mat mat(600, 800, CV_8UC3); // (H W Type)
// mat.create(300, 400, CV_8UC3)
int es = mat.elemSize();
int size = mat.rows * mat.cols * es;
PrintMs();
// 连续遍历
for(int i = 0; i < size; i = i + 3){
// 填充蓝色
mat.data[i] = 255; // B
mat.data[i + 1] = 0; // G
mat.data[i + 2] = 0; // R
}
PrintMs("mat data ms"); // 打印连续遍历所需的时间
namedWindow("test_mat1");
imshow("test_mat1", mat);
waitKey(0);
PrintMs(); // 重新置0
// 不连续遍历
for(int row = 0; row < mat.rows; row++){
for(int col = 0; col < mat.cols; col++){
// 填充红色
(&mat.data[row*mat.step[0]])[col*es] = 0; // B
(&mat.data[row*mat.step[0]])[col*es+1] = 0; // G
(&mat.data[row*mat.step[0]])[col*es+2] = 255; // R
}
}
PrintMs("mat step ms"); // 打印不连续遍历所需的时间
namedWindow("test_mat2");
imshow("test_mat2", mat);
waitKey(0);
return 0;
}
2--Cmake编译
①CMakeLists.txt
cmake_minimum_required(VERSION 3.24) # 指定 cmake的 最小版本
project(test) # 设置项目名称
find_package(Opencv REQUIRED)
add_executable(main_demo main.cpp) # 生成可执行文件
target_link_libraries(main_demo ${OpenCV_LIBS} ) # 设置target需要链接的库
②编译
mkdir build
cd build
cmake ..
make
3--运行
./main_demo
4--分析总结
①Mat对象创建的两种方式:Mat mat(H, W, CV_8UC3) 和 mat.create(H, W, CV_8UC3);
8表示bit_depth,即每个像素点占8bite;
U表示unsigned int,即无符号整型;类似的还有S表示signed int,即有符号整型;F表示float,即单精度浮点型;
C表示number_of_channels,即图片的通道数。
②mat.step[i]表示维度i 在内存中的字节数大小。
③一般而言,不连续遍历的用途更为广泛。