2

大家好,感谢您的关注,我有以下问题:

我有一个在图像上vector<Point>存储多个坐标的。我想要:

  1. 创建一个 CV_8U 类型的空白白色垫子
  2. 对于坐标向量中的每个点,我想在白色图像上用黑色标记那个点,
  3. 打印图像。

这是迭代向量的函数:

void Frag::updateImage(vector<Point> points){

    ...

    if(NewHeight > 0 && NewWidth > 0){

        cv::Mat NewImage = cv::Mat(NewHeight, NewWidth, CV_8U, Scalar(255));
        // Is this the correct way to initialize a blank Mat of type CV_8U???

        for (unsigned int i = 0; i < points.size(); i++) {

            uchar* PointPtr = NewImage.ptr<uchar> (points[i].x, points[i].y);
            *PointPtr = 0;
        }

        Utility::DisplayImage(NewImage);

    }

    ...

 }

这是我的打印功能

void Utility::DisplayImage(Mat& tgtImage) {

    namedWindow("Draw Image", (CV_WINDOW_NORMAL | CV_WINDOW_KEEPRATIO));
    imshow("Draw Image", tgtImage);
    waitKey(0);

}

我的问题如下:看起来这些值存储在矩阵中(我尝试打印它们),但是 DisplayImage 函数(在所有其他情况下都可以正常工作)一直向我显示空白图像。

我错过了什么?指针相关的问题?垫初始化问题?

<--- --- --- 更新 --- --- --->

在第一个答案之后,我发现实际问题是我无法在垫子中设置值。我发现这是因为我添加了一个简单的循环来打印 Mat 中的所有值(因为我的 Mats 通常非常小)。循环如下(我把它放在对坐标向量的迭代之后:

for(int j = 0; j< NewHeight; j++){
    for(int i = 0; i< NewWidth; i++){
        Logger << (int)NewImage.at<uchar> (i, j) << " ";
    }
    Logger << endl;
}

它的结果总是这样:

Creating image with W=2, H=7.
255 255 
255 255 
255 255 
255 255 
255 255 
255 255 
255 255 

所以值只是没有设置,知道吗?

它可能与图像类型(CV_8U)有关吗?

4

3 回答 3

1

我希望这会有所帮助,尚未测试。

Mat NewImage = Mat(NewHeight, NewWidth, CV_8U, Scalar(255));

for(int j = 0; j< NewHeight; j++){
for(int i = 0; i< NewWidth; i++){

for (int k = 0; k < points.size(); k++) {

            if(i==points[k].x && j ==points[k].y)
               NewImage.at<uchar>(j,i) = 0;
        }

}        
}
imshow(NewImage);
于 2013-01-30T22:01:27.660 回答
1

在对我的代码进行彻底分析后,我检测到存储在向量中的坐标是相对于更大的 Mat 而言的,比如 Mat OldImage 垫子NewImage旨在存储垫子点的一个子集OldImageNewImage比 OldImage 小得多),但是没有从一个坐标系到另一个坐标系的坐标转换,我总是写在错误的位置。

我通过使用简单的减法将点转换为正确的坐标系解决了这个问题。

于 2013-01-31T10:11:16.530 回答
1

你可以改为:

for (int i =0; i < points.size(); i++)
{
    cv::circle(NewImage, points.at(i), 0, cv::Scalar(0));    //The radius of 0 indicates a single pixel
}

这省去了直接的数据访问和指针操作,并且更具可读性。

于 2013-01-30T22:51:55.473 回答