将cv::Scalar的值设置为opencv中cv::Mat中的一个像素的正确(最佳)方法是什么?
What is the correct (best) way to set the value of cv::Scalar to a pixel in a cv::Mat in opencv?
我有一个cv::Mat
对象,
cv::Mat _a ...
…和cv::Scalar
对象
cv::Scalar _b ...
将_b
的值设置为_a
中一个像素(在位置(x, y))的正确(最佳)方法是什么?
_a
可以有1、2、3、4个通道,但是代码应该在所有情况下都工作,即:
- 当
_a
有一个通道时,_b
的第一个元素应该被分配到各自的位置 - 当
_a
有两个通道时,_b
的第一个元素应该分配给第一个通道,_b的第二个元素应该分配给第二个通道,两者都在各自的位置 - (…)
cv::Mat
有一个重载的operator=
,它接受一个cv::Scalar
。这正是你想要的行为。不幸的是,没有直接的方法将Scalar
分配给像素值。但是,您可以在坐标(x, y)
处创建一个包含单个像素的兴趣区域,并将Scalar
分配给该区域:
cv::Mat a; // contains data
cv::Scalar b(1,2,3,4);
cv::Range xr(x, x + 1);
cv::Range yr(y, y + 1);
a(xr, yr) = b;
这不是很好或简洁,但您可以切换Mat
的可能类型并迭代Mat
的通道以创建/分配Scalar
。像这样:
void getPixel(Mat m, int x, int y, Scalar &pixel) {
switch (m.depth()) {
case 0:
for (size_t i = 0; i < m.channels(); ++i) pixel[i] = m.at<uchar>(x, y);
break;
case 1:
for (size_t i = 0; i < m.channels(); ++i) pixel[i] = m.at<char>(x, y);
break;
case 2:
for (size_t i = 0; i < m.channels(); ++i) pixel[i] = m.at<ushort>(x, y);
break;
case 3:
for (size_t i = 0; i < m.channels(); ++i) pixel[i] = m.at<short>(x, y);
break;
case 4:
for (size_t i = 0; i < m.channels(); ++i) pixel[i] = m.at<long>(x, y);
break;
case 5:
for (size_t i = 0; i < m.channels(); ++i) pixel[i] = m.at<float>(x, y);
break;
case 6:
for (size_t i = 0; i < m.channels(); ++i) pixel[i] = m.at<double>(x, y);
break;
}
}
我不会使用opencv的。at函数。当你迭代一个大的画面时,它很慢。准备一些结构体,例如RGB图像:
#pragma pack(push, 2)
struct RGB { //members are in "bgr" order!
uchar blue;
uchar green;
uchar red; };
然后创建一个指向图像扫描线的指针,如下所示:
RGB& rgb = image.ptr<RGB>(y)[x]; //y = row, x = col
你可以这样赋值:
cv::Scalar(image.ptr<RGB>(y)[x].value[0], image.ptr<RGB>(y)[x].value[1], image.ptr<RGB>(y)[x].value[2]);
相关文章:
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- 如何在24位SDL_Surface上设置像素的颜色
- 如何从SDL_Surface获取特定像素的颜色
- 如何将CMSampleBufferRef/CIImage/UIImage转换为像素,例如uint8_t[]
- 在C++中查找像素 RGB 数据的最快方法是什么?
- 是否可以从 OpenGL 缓冲区获取原始大小的像素?
- 选择基于另一个垫子的非零像素的cv::Mat的一部分?
- 如何使用 sdl2 快速绘制像素网格?
- 如何在C++中进行像素操作? - Linux
- 他们如何将红外锁定像素转换为镜头前方 1m 的正常平面上的位置
- 将 cv::Mat 转换为无符号的 int 像素
- 如何从C 中的CV :: MAT图像中有效提取某些像素
- 如何在 openCV 中修改 cv::Mat 的像素数据
- 如何将像素设置为cv::Mat对象中的值
- 打开CV水彩色过滤器.(在图像的像素中迭代)
- 打开CV:访问灰度图像的像素
- 尝试设置cv::Mat的像素值时引发分段错误
- 如何设置cv::Mat1b的像素值
- 将cv::Scalar的值设置为opencv中cv::Mat中的一个像素的正确(最佳)方法是什么?