我想将nxm cv :: Mat的所有奇数行设置为标量值。这个问题有蛮力的方法,但我想知道是否有更优雅的东西。
从这个问题扩展,我想将不同通道的所有偶数行设置为标量值。
答案 0 :(得分:1)
没有OpenCV内置函数可以做到这一点,但这可以通过3行代码轻松完成。
#include <opencv2\opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
// The new value for the rows
uchar some_value = 100;
// Your matrix (here random initialized)
Mat1b mat(5, 3, uchar(0));
randu(mat, 0, 10);
// Set all even rows to some_value
for (int r = 0; r < mat.rows; r += 2) {
for (int c = 0; c < mat.cols; ++c) {
mat(r, c) = some_value;
}
}
return 0;
}
是的,这可能是你叫做“暴力”,但这是对矩阵访问次数较少的方法。 它也非常快,你最终可以通过指针实现它更快(这里有3个通道的例子):
#include <opencv2\opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Vec3b some_value(100, 101, 102);
Mat3b mat(5, 3, Vec3b(0,0,0));
randu(mat, Scalar(0, 0, 0), Scalar(10, 10, 10));
for (int r = 0; r < mat.rows; r += 2) {
Vec3b* ptr = mat.ptr<Vec3b>(r);
for (int c = 0; c < mat.cols; ++c) {
ptr[c] = some_value;
}
}
return 0;
}
您还可以创建一个奇数行为白色(255)的蒙版,偶数行为黑色(0),并使用cv::setTo
根据蒙版设置值。然而,这可能要慢得多,因为您需要 i)创建掩码,并且 ii)访问矩阵中的每个像素(尽管可能利用优化代码)。 / p>
答案 1 :(得分:0)
不确定速度,但我想OP提到MATLAB矩阵操作的优雅,并确定其中一些已导入OpenCV,例如。
cv::Mat m(8,15,CV_32FC1,cv::Scalar(0));
for (int i=0;i<m.rows;i+=2)
m.row(i).setTo( 32 );
同样,您可以使用cv::Mat
函数分别为每列构建cv::Mat::col(int i)
标头。