OpenCV:为矩阵元素分配新值
OpenCV: assigning new values to matrix elements
我正在尝试读取图像,并使用以下代码将读取图像的一些值分配给另一个新图像:
cv::Mat source = cv::imread("001.jpg");
cv::cvtColor( source , source , CV_BGR2GRAY );
cv::Mat result = cv::Mat( source.rows, source.cols, source.type() );
int dx = 0;
int dy = 0;
int len = 30;
for( int i = 0; i < source.cols - len; i ++ )
{
dx = i + len;
for( int j = 0; j < source.rows; j++ )
{
dy = j + 0.5 * dx;
if( 0 <= dx && dx < source.cols && 0 <= dy && dy < source.rows )
{
result.at<uchar>(i,j) = source.at<uchar>(dx,dy);
}
}
}
但是代码在运行后停止,而不会发出任何错误消息。我试图调试它并怀疑result.at<uchar>(i,j) = source.at<uchar>(dx,dy)
行导致了问题。有人可以向我解释一下吗?
罪魁祸首在这里:
result.at<uchar>(i,j) = source.at<uchar>(dx,dy);
你得到了相反的 I,J 和 DX Dy。
它在OpenCV中mat.at<type>(row,col);
,而不是mat.at<type>(x,y);
除了下面的Berak
答案之外,我认为您还应该执行以下操作
Initialize result image with zeros:
我觉得有问题。您的dx
在每个循环中都会递增 30
,因此,您的for loop
将仅在少数情况下运行。但是在for loop
期间无法填充的result
单元格中的值应该是多少
尽管
文档对此不是很清楚,但at
函数cv::Mat::at(y,x)
是这样使用的。这可能是导致问题的原因。
此外,为了使您的代码更高效,您应该像这样反转 x 和 y 循环:
for( int j = 0; j < source.rows; j ++ )
{
for( int i = 0; i < source.cols- len; i++ )
{
dx = i + len;
dy = j + 0.5*dx;
if( 0 <= dx && dx < source.cols && 0 <= dy && dy < source.rows )
{
result.at<uchar>(j, i) = source.at<uchar>(dy, dx);
}
}
}
这是因为在 OpenCV 中,图像是逐行存储的,因此将 x 循环定义为内部循环要快得多。
相关文章:
- 访问动态分配列表中的元素
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- 动态分配列表 - 创建一个函数,用于删除所有包含偶数值的元素
- 是否有具有外部元素分配的序列容器(在 STL 中)?
- C++ 将元素分配给映射值时访问错误
- 如何通过查找迭代器结果分配给一组对的元素
- C++通过别名指针以静默方式将错误的类型分配给数组元素
- c++ 使用动态分配运算符反向数组元素
- 为什么在 c++ 中分配 char 数组元素时,分配的字符会被销毁?
- 在 CPP 中将元素分配给矢量
- 如何将元素分配给向量?
- 并行算法将向量的元素分配到另一个元素的元素
- 无法在重载运算符时将数组元素分配给类变量"="
- 将字符串元素分配给结构数组中的结构
- 为每个循环中的std :: vector的当前元素分配迭代器
- OpenCV:为矩阵元素分配新值
- 将矢量元素分配给字符变量
- 如何拥有一个带有类元素的向量,其中一些元素分配了构造函数参数
- 为什么std::deque在默认构造函数中为它的元素分配内存?
- C++将字符串的元素分配给一个新字符串