我正在尝试使用opencv这个非常简单的东西,但是会收到错误。 我只是尝试读取16位png图像并访问特定的像素值。我尝试了很多方法,但无法管理获取价值。我在windows8 64bit上使用OpenCV3.0。
注意:使用CV_LOAD_IMAGE_GRAYSCALE读取图像时很好,但CV_LOAD_IMAGE_ANYDEPTH上升错误。但是当我使用CV_LOAD_IMAGE_GRAYSCALE时,我的最高像素是9,应该是2000左右
我上传了示例图片。example image
我的示例代码:
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
int _tmain(int argc, _TCHAR* argv[])
{
cv::Mat frame = cv::imread("filepath", CV_LOAD_IMAGE_ANYDEPTH );//using CV_LOAD_IMAGE_GRAYSCALE is fine, but CV_LOAD_IMAGE_ANYDEPTH rising error
frame.convertTo(frame, CV_16U);// to be sure... i omitted this part also and same error
double min, max;
cv::Point mloc, mxloc;
cv::minMaxLoc(frame, &min, &max, &mloc, &mxloc);
//i can access min and max values but not the specific pixel value
float zmx = frame.at<unsigned char>(118, 38);//rise error
float zm = frame.at<float>(30,40);//rise error
return 0;
}
错误讯息:
OpenCVTest.exe中0x00007FF8EB288A5C处的未处理异常:Microsoft C ++异常:cv ::内存位置0x000000A47F40F230处的异常。
但我认为这是误导性的错误,我检查我的图像是320 * 240,所以我确定那个位置有像素。
我也尝试过Scalar,但我得到同样的错误
答案 0 :(得分:1)
你应该注意几件事。
首先,您要定义frame
两次。
第二,这一行float zmx = frame.at<unsigned char>(118, 38);
有几个问题。您要将unsigned char
分配给float
。您还应该注意到订单被反转以访问您调用x,y
的{{1}}像素值,然后分配给frame.at<unsigned char>(y, x)
的最佳方式就是这样
Scalar
或使用Scalar fmx = frame.at<uchar>(118, 38);
以避免混淆
Point
最后一件事,确保您正确加载图像并Scalar fmx = frame.at<uchar>(Point(38,118));
具有图像数据
更新
我刚刚测试了你的代码并且工作正常(请查看下面的内容),我想不出任何东西,但没有在提供的路径中找到图像
frame
更新#2 以使用#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
int main(int argc, char** argv)
{
cv::Mat frame = cv::imread("0FD0X.png", CV_LOAD_IMAGE_GRAYSCALE);
frame.convertTo(frame, CV_16U);// to be sure... i omitted this part also and same error
double min, max;
cv::Point mloc, mxloc;
cv::minMaxLoc(frame, &min, &max, &mloc, &mxloc);
//i can access min and max values but not the specific pixel value
float zmx = frame.at<unsigned char>(118, 38);// no error
float zm = frame.at<float>(30, 40);// no error
std::cout << zmx << std::endl; // out 0
std::cout << min << std::endl; // out 0
std::cout << max << std::endl; // out 9
std::cout << mloc << std::endl; // out [0,0]
std::cout << mxloc << std::endl; // out [125,30]
return 0;
}
数据类型访问您需要访问的多渠道图片。还要注意点坐标的顺序。检查以下代码
Vec3b