大家好,感谢您的关注,我有以下问题:
我有一个在图像上vector<Point>
存储多个坐标的。我想要:
- 创建一个 CV_8U 类型的空白白色垫子
- 对于坐标向量中的每个点,我想在白色图像上用黑色标记那个点,
- 打印图像。
这是迭代向量的函数:
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)有关吗?