0

大家好,我正在尝试使用 C++ openCV 2.4.5 获取图像中像素的 RGB

但是当我编译时出现此错误。

它会加载图像,但是当我尝试获取像素的 RGB 时会出现异常

有人能帮帮我吗?

在此处输入图像描述

以下代码加载图像并在索引 25,4 处找到像素的 RGB
我的代码是:

 #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    #include <opencv/cv.h>
    #include <opencv/highgui.h>
    #include <iostream>
    using namespace std;
    using namespace cv;
    int main()
    {
        int x;
        Mat input = imread("C:/red.jpg");
        if (input.empty())
            {
                std::cout << "!!! Failed imread(): image not found" << std::endl;
                cin>>x;
                return 0;
                // don't let the execution continue, else imshow() will crash.
            }
        imshow("input", input);
         Vec3f pixel = input.at<Vec3f>(25, 40);
         if( !pixel[0])
         {
             std::cout << "!!! Failed pixel(): image not found" << std::endl;
                cin>>x;
                return 0;
         }
            int b = pixel[0];
            int g = pixel[1];
            int r = pixel[2];
        cout<<b;
        cout <<" ";
        cout<<r;
        cout <<" ";
        cout <<g;
        cin>>b;

        /*




        // detect squares after filtering...
        */
        return 0;
    }
4

2 回答 2

3

您的图像可能是 CV_8UC3 类型,这意味着像素的值存储为 3 通道 8 位 uchar。在

Vec3f pixel = input.at<Vec3f>(25, 40);

您正在尝试以浮点数的形式访问像素值,因为在 OpenCVVec3f中被定义为typedef Vec<float, 3> Vec3f;. 这会导致您的程序崩溃。相反,它应该是:

Vec3b pixel = input.at<Vec3b>(25, 40);

在 OpenCVVec3b中被定义为typedef Vec<uchar, 3> Vec3b;,这就是你想要的。

这是 cv:: Vec数据类型的文档。

编辑您可以简单地输出像素数据

cout << pixel << endl;

或像这样:

printf("[%u, %u, %u]", pixel[0], pixel[1], pixel[2]);

或像这样:

int b = static_cast<int>(pixel[0]);
int g = static_cast<int>(pixel[1]);
int r = static_cast<int>(pixel[2]);
cout<< "[" << b <<", " << g << ", " << r << "]" << endl;
于 2013-05-09T14:44:26.307 回答
0

你应该使用:

Mat input = imread("C://red.jpg");

代替 :

Mat input = imread("C:/red.jpg");
于 2015-09-17T10:37:55.157 回答