//构建一个5*5的三通道二维矩阵;每个矩阵中元素包含三个值,每个值类型为double
cv::Mat test_mat = cv::Mat(5,5,CV_64FC3);
for (int h = 0; h < test_mat.rows; h++) {
for (int w = 0; w < test_mat.cols; w++) {
test_mat.at<cv::Vec3d>(h, w)[0] = 100 + h * 100 + w + 1;
test_mat.at<cv::Vec3d>(h, w)[1] = 100 + h * 100 + w + 2;
test_mat.at<cv::Vec3d>(h, w)[2] = 100 + h * 100 + w + 3;
}
}
//访问矩阵中第一个元素(0,0),该元素有三个double类型组成
std::cout << test_mat.at<cv::Vec3d>(0,0) << std::endl;
//访问矩阵中第一个元素(0,0)的第一个通道,返回一个double值
std::cout << test_mat.at<cv::Vec3d>(0, 0)[1] << std::endl;
//设定元素类型为double对第一个元素(0,0)进行访问,返回该元素第一个通道值
std::cout << test_mat.at<double>(0,0) << std::endl;
//设定元素类型为double对元素(2,2)进行访问,返回该元素第一个通道值
std::cout << test_mat.at<double>(2,2) << std::endl;
std::cout << test_mat << std::endl;
opencv中mat的访问存储方式和访问方法:
mat创建时可以确定内部元素的类型和通道数;
mat中的元素存放是先行后列形式,即先把一行中的全部元素保存后再保存下一行;当mat是单通道时则每一个元素就只是一个基本类型元素,例如double;当mat是多通道时,则每一个元素就是一个单行多列容器,例如当mat是RGB图片时,通道数为三,每一个元素是三个基本数据类型char组成的1*3大小的容器;
mat在内存中的实际存放方式是,先存放第一行元素,如果是多通道,则会把同一位置中的所有通道数据全部连续存放完毕,再存放下一个位置的全部通道元素;
上述代码运行结果:
cv::mat的连续性问题:
OpenCV isContinuous()连续存储的问题_pan_jinquan的博客-CSDN博客_mat.iscontinuous