OpenCV读取图像像素值

时间:2016-03-08 18:48:04

标签: c++ opencv image-processing visual-studio-2013

我正在尝试使用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,但我得到同样的错误

1 个答案:

答案 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