gpt4 book ai didi

c++ - OpenCv:如何将 vector 转换为 Mat (CV_8U)

转载 作者:搜寻专家 更新时间:2023-10-31 01:50:47 25 4
gpt4 key购买 nike

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

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

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

这是在 vector 上迭代的函数:

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);

}

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

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

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

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

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) 有关的东西??

最佳答案

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

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);

关于c++ - OpenCv:如何将 vector<Point> 转换为 Mat (CV_8U),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14614460/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com