Opencv 使用.at和.at访问像素值不起作用

Opencv 使用.at和.at访问像素值不起作用,opencv,visual-studio-2012,pixel,pixels,grayscale,Opencv,Visual Studio 2012,Pixel,Pixels,Grayscale,我正在尝试使用Visual Studio Express 2012 for Windows Desktop重写Mat类型灰度图像中的像素值。我试过: imgGrayComp.at<uchar>(5, 4) = 0; 在分类中: classify("./src/0.jpg", contour, hierarchy, mDatabase, '0'); void classify(std::string imageFile, vector<vector<Poi

我正在尝试使用Visual Studio Express 2012 for Windows Desktop重写Mat类型灰度图像中的像素值。我试过:

imgGrayComp.at<uchar>(5, 4) = 0; 

在分类中:

classify("./src/0.jpg", contour, hierarchy, mDatabase, '0');
void classify(std::string imageFile, 
    vector<vector<Point> > contour,
    vector<Vec4i> hierarchy, float mDatabase [][charsToClassify],
    char whichChar)
{
    Mat image = imread(imageFile, 1);
    Mat imageGrayClassify;

    image.convertTo(imageGrayClassify, COLOR_BGR2GRAY);
    int numPoints = computeNumContourPts(imageGrayClassify); // calling compute...()
}
在计算机中…:

int computeNumContourPts(Mat imgGrayComp)
{

    // dilation x1 (increases workload):
    dilate(imgGrayComp, imgGrayComp, Mat(), Point(-1,-1), 2);
    // erosion x1 (decreases workload):
    erode(imgGrayComp, imgGrayComp, Mat(), Point(-1,-1), 1);

    imgGrayComp.at<uchar>(5, 4) = 0;
}
问题是图像灰度分类不是图像的灰度图像。您可以使用.convertTo,它可以将e。G将CV_32F图像转换为CV_8U图像,但不将BGR转换为灰色。此调用将图像转换为CV_64F,因为CV_BGR2GRAY==CV_64F==6。所有这些都只是宏和类型不安全的接口

你需要

cv::cvtColor(image, imageGrayClassify, CV_BGR2GRAY);
那么你应该可以在5点4分进入imgGrayComp。请注意.at5,4仍然是错误的,因为灰度图像只有一个通道。Vec3b通常用于3通道8位图像。

问题在于图像灰度分类不是图像的灰度图像。您可以使用.convertTo,它可以将e。G将CV_32F图像转换为CV_8U图像,但不将BGR转换为灰色。此调用将图像转换为CV_64F,因为CV_BGR2GRAY==CV_64F==6。所有这些都只是宏和类型不安全的接口

你需要

cv::cvtColor(image, imageGrayClassify, CV_BGR2GRAY);

那么你应该可以在5点4分进入imgGrayComp。请注意.at5,4仍然是错误的,因为灰度图像只有一个通道。Vec3b通常用于3通道8位图像。

错误调用convertTo时,您正在将图像转换为64F精度

你在这里干什么

image.convertTo(imageGrayClassify, COLOR_BGR2GRAY);
相当于

image.convertTo(imageGrayClassify, CV_64F);
因为convertTo需要一个数据类型enum;不是转换枚举。您的转换枚举颜色\u BGR2GRAY=6已转换为数据类型枚举CV\u 64F=6

我想你是想在那里用的


由于您的imageGrayComp不是灰度或8U,您无法使用vec3b或uchar访问其像素。

错误调用convertTo,您将图像转换为64F精度

你在这里干什么

image.convertTo(imageGrayClassify, COLOR_BGR2GRAY);
相当于

image.convertTo(imageGrayClassify, CV_64F);
因为convertTo需要一个数据类型enum;不是转换枚举。您的转换枚举颜色\u BGR2GRAY=6已转换为数据类型枚举CV\u 64F=6

我想你是想在那里用的


由于您的imageGrayComp不是灰度或8U,因此无法使用vec3b或uchar访问其像素。

问题在于:

而不是使用cv::cvtColorimage、imageGrayClassify、cv_BGR2GRAY;,您使用了image.convertTo,它用于转换图像的数据类型

关于对Canberk答案的一个新错误的评论,很简单,很可能你的图像是空的

使用


或者,甚至在使用cvtColor之前,您也可以使用imshow查看图像是否已成功显示。干杯。

问题在于:

而不是使用cv::cvtColorimage、imageGrayClassify、cv_BGR2GRAY;,您使用了image.convertTo,它用于转换图像的数据类型

关于对Canberk答案的一个新错误的评论,很简单,很可能你的图像是空的

使用


或者,甚至在使用cvtColor之前,您也可以使用imshow查看图像是否已成功显示。干杯。

请提供更多的代码。imgGrayComp似乎有问题,可能是尺寸/类型/深度不匹配?需要更多信息。添加了更多代码。希望这有帮助。请提供更多的代码。imgGrayComp似乎有问题,可能是尺寸/类型/深度不匹配?需要更多信息。添加了更多代码。希望这有帮助。我确实试过cvtColorimage,imageGrayClassify,CV_BGR2GRAY,但是命令提示符抛出OpenCV错误:断言失败,在cv::cvtColor文件中scn==3 | | scn==4,第3737行,OpenCV\modules\imgproc\src\color.cpp。另外,根据您链接到的页面,cvtColor的第一个参数必须是constArr*,而不是Mat。^对不起,我写了constArr*。。。我是指const CVARR*。您使用C++接口,CVToCube接受Mat数据类型。您也可以使用c接口并使用IplImage*作为图像数据类型,这是从cvArr中插入的*我确实尝试过cvtColorimage、ImageGrayClassification、CV_BGR2GRAY,但是命令提示符抛出OpenCV错误:断言失败,在cv::cvtColor文件中scn==3 | | scn==4,第3737行,OpenCV\modules\imgproc\src\color.cpp。另外,根据您链接到的页面,cvtColor的第一个参数必须是constArr*,而不是Mat。^对不起,我写了constArr*。。。我是指const CVARR*。您使用C++接口,CVToCube接受Mat数据类型。您也可以使用c接口并使用IplImage*作为图像数据类型,该类型由cvArr*1插入。谢谢您的输入。2参见我对坎伯克答案的评论。1感谢您的意见。请看我对坎伯克答案的评论。就是这样。。。固定的你是对的。结果证明文件的路径是错误的。我必须从Debug文件夹备份到其父文件夹,然后备份到src同级文件夹。现在看来,我一直在处理两个问题,我不知道哪一个是最好的。@Andrey,我做了answe
r你的两个问题都是最快的,所以我想请你给我一个公认的答案。哈哈。但当然,为了避免下一次出现这样的困境,在当前问题解决并出现新问题后,大多数人通常采取的步骤是接受答案,并针对新问题发布另一个答案。您可以评论新问题到已回答帖子的链接,提醒回答者,以便他在解决新问题时可以获得更多的重复:我不确定我是否完全理解。第一个问题解决后,我会将其标记为最佳答案,即使我知道同一代码中存在另一个问题,也会在该答案上添加注释,并链接到第二个问题的答案。。。那就是你失去我的地方。一步一步地陪我走。哈哈。这不是必须的。这只是一些用户所做的,意思是,第二个问题,你复制这个链接,例如,这个问题的链接:,并通过帖子的评论分享这个链接,回答你第一个问题的人,说在遵循你的方法后出现了一个新问题,等等。看看你是否知道如何解决它?但是不同的用户,不同的心态。我看到人们这么做,这只是一个建议;就是这样。。。固定的你是对的。结果证明文件的路径是错误的。我必须从Debug文件夹备份到其父文件夹,然后备份到src同级文件夹。现在看来,我一直在处理两个问题,我不知道哪一个最好。@Andrey,我确实以最快的速度回答了你的两个问题,所以我想请你给我一个公认的答案。哈哈。但当然,为了避免下一次出现这样的困境,在当前问题解决并出现新问题后,大多数人通常采取的步骤是接受答案,并针对新问题发布另一个答案。您可以评论新问题到已回答帖子的链接,提醒回答者,以便他在解决新问题时可以获得更多的重复:我不确定我是否完全理解。第一个问题解决后,我会将其标记为最佳答案,即使我知道同一代码中存在另一个问题,也会在该答案上添加注释,并链接到第二个问题的答案。。。那就是你失去我的地方。一步一步地陪我走。哈哈。这不是必须的。这只是一些用户所做的,意思是,第二个问题,你复制这个链接,例如,这个问题的链接:,并通过帖子的评论分享这个链接,回答你第一个问题的人,说在遵循你的方法后出现了一个新问题,等等。看看你是否知道如何解决它?但是不同的用户,不同的心态。我看到人们这么做,这只是一个建议;
CV_Assert(!image.empty()); //use this then the cvtColor, note this is a comment!!!

cvtColor(image,imageGrayClassify, CV_BGR2GRAY);