我目前想将一些值读入一个由8位无符号整数值组成的3通道480行640列矩阵中。我正在初始化矩阵,如下所示:
声明:
rgbMatrix = Mat::zeros(480,640,CV_8UC3);
当我尝试遍历整个矩阵时,我无法使用以下方法分配/获取值。值只是保持为0。我的代码如下:
for (int i = 0; i < rgbMatrix.rows; i++)
{
for (int j = 0; j < rgbMatrix.cols; j++)
{
(rgbMatrix.data + rgbMatrix.step * i)[j * rgbMatrix.channels() + 0] = *value0*;
(rgbMatrix.data + rgbMatrix.step * i)[j * rgbMatrix.channels() + 1] = *value1*;
(rgbMatrix.data + rgbMatrix.step * i)[j * rgbMatrix.channels() + 2] = *value2*;
}
}
然而,当我声明三个单独的1通道矩阵(也是480行乘640列的8位无符号整数值)并试图访问这些矩阵的元素时,以下代码起作用:
声明:
rgbMatrix0 = Mat::zeros(480,640,CV_8UC1);
rgbMatrix1 = Mat::zeros(480,640,CV_8UC1);
rgbMatrix2 = Mat::zeros(480,640,CV_8UC1);
for (int i = 0; i < rgbMatrix0.rows; i++)
{
for (int j = 0; j < rgbMatrix0.cols; j++)
{
(rgbMatrix0.data + rgbMatrix0.step * i)[j] = *value0*;
(rgbMatrix1.data + rgbMatrix1.step * i)[j] = *value1*;
(rgbMatrix2.data + rgbMatrix2.step * i)[j] = *value2*;
}
}
现在,我只想使用一个矩阵来进行这些操作,因为必须跟踪三个单独的变量会在一段时间后变得令人厌倦。我有一种感觉,我没有访问内存中三通道矩阵的正确点。有人知道我如何完成我在代码的第二部分中所做的事情,但使用一个三通道矩阵而不是三个单独的一通道矩阵吗?
谢谢。
有很多方法可以做到这一点,例如:
cv::Mat rgbMatrix(480,640,CV_8UC3);
for (int i = 0; i < rgbMatrix.rows; i++)
for (int j = 0; j < rgbMatrix.cols; j++)
for (int k = 0; k < 3; k++)
rgbMatrix.at<cv::Vec3b>(i,j)[k] = value;
[k] 这是通道值。
要将所有矩阵元素设置为特定值,例如5,您可以这样做:
cv::Mat rgbMatrix2(cv::Size(480,640), CV_8UC3, cv::Scalar(5,5,5));
std::cout << rgbMatrix2 << std::endl;
很抱歉,因为我是用iPhone写的,所以看不到你的代码。当你使用3通道矩阵时,你可以使用获得像素
Vec3b像素=rgb矩阵.at(行,列);
现在您可以使用以下方式访问频道:pix[0]=255;pix[1]+=pix[2];
p.s.通常,rgb矩阵像素的类型为vec3b或vec3d。始终投射图像。在<>具有相关类型
使用Vec3b-用于uchar,Vec3i-用于int,Vec3f-用于float,Vec3d-用于双非常简单
Mat rgbMatrix = Mat::zeros(480,640,CV_8UC1);
for (int i = 0; i < rgbMatrix.rows; i++)
{
for (int j = 0; j < rgbMatrix.cols; j++)
{
rgbMatrix.at<Vec3b>(i,j)[0] = *value0;
rgbMatrix.at<Vec3b>(i,j)[1] = *value1;
rgbMatrix.at<Vec3b>(i,j)[2] = *value2;
}
}
vector<cv::Point3f> xyzBuffer;
cv::Mat xyzBuffMat = cv::Mat(307200, 1, CV_32FC3);
for (int i = 0; i < xyzBuffer.size(); i++) {
xyzBuffMat.at<cv::Vec3f>(i, 1, 0) = xyzBuffer[i].x;
xyzBuffMat.at<cv::Vec3f>(i, 1, 1) = xyzBuffer[i].y;
xyzBuffMat.at<cv::Vec3f>(i, 1, 2) = xyzBuffer[i].z;
}
这里,0、1和2分别是存储x、y和z值的通道。