我正在尝试使用以下代码读取图像并将读取的图像的某些值分配给另一个新图像:
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)
导致了问题。谁可以给我解释一下这个?
答案 0 :(得分:2)
罪魁祸首在这里:
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);
答案 1 :(得分:1)
除了下面的Berak
答案,我认为您还应该执行以下操作
Initialize result image with zeros:
我觉得有问题。您的dx
在每个循环中都会增加30
,因此for loop
只会在少数情况下运行。但result
for loop
单元格中的值应该是多少?
答案 2 :(得分:0)
虽然文档对此不太清楚,但函数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循环定义为内部循环要快得多。