use*_*857 2 c opencv image-processing
在OpenCV中做什么cvSet2D和cvGet2D实际做什么?就像在下面的代码中旋转矩阵一样,我正在使用cvGet2D:
CvMat* rot3= cv2DRotationMatrix( center, angle, scale, rot);
cv::Mat rot3cpp(rot3);
for(int j=0;j<rot3cpp.rows;j++)
{
for (int i=0;i<rot3cpp.cols;i++)
{
CvScalar scal = cvGet2D(rot3,j,i);
printf("new matrix is %f: \n", rot3cpp.at<float>(j,i));
}
}
Run Code Online (Sandbox Code Playgroud)
cvSet2D如果我添加该行,将如何使用更改我的代码:
cvSet2D(rot3,i,j,scal); // set the (i,j) pixel value
Run Code Online (Sandbox Code Playgroud)
在打印价值之前?"设置(i,j)像素值"是什么意思?
Aur*_*ius 11
短答案: cvGet2D()和cvSet2D()用于获取和分别设定的二维矩阵或图像的元素.
答案很长:
假设你创建了一个CvMat m:
CvMat* m = cvCreateMat(3, 3, CV_32FC1);
float data[9] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
cvSetData(m, data, m->step);
Run Code Online (Sandbox Code Playgroud)
这会创建一个如下所示的矩阵:
[0.0 1.0 2.0]
[3.0 4.0 5.0]
[6.0 7.0 8.0]
Run Code Online (Sandbox Code Playgroud)
如果要获取包含值的元素2.0,可以使用cvGet2D()第一行和第三列中的元素:
CvScalar scal = cvGet2D(m, 0, 2); // Rows and columns are zero-indexed
Run Code Online (Sandbox Code Playgroud)
但由于这只是一个单通道矩阵,因此只有第一个元素scal包含有意义的数据.
double value = scal.data[0]; // Voila! value == 2.0
Run Code Online (Sandbox Code Playgroud)
但是现在如果你想改变那个元素的价值呢?然后你会用cvSet2D():
CvScalar new_value = cvScalar(9.0);
cvSet2D(m, 0, 2, new_value);
Run Code Online (Sandbox Code Playgroud)
然后,数据m如下所示:
[0.0 1.0 9.0] <-- note the change
[3.0 4.0 5.0]
[6.0 7.0 8.0]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6799 次 |
| 最近记录: |