Opencv 2 Mat-运行时出错

时间:2014-05-21 09:31:16

标签: c++ opencv

我从图像处理的基础开始,我正在尝试使用平均值将RGB图像转换为灰度。

我的代码是

#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>

#include<iostream>

using namespace cv;

int main()
{

    Mat image = imread("a.jpg");
    namedWindow("Original ");
    namedWindow("Grey");
    imshow("Original", image);  
    Mat grey;
    std::cout << "hello\n";
    for (int i = 0; i < image.rows; i++)
    {
        for (int j = 0; j < image.cols; j++)
        {
            grey.at<Vec3b>(i, j) = (image.at<Vec3b>(i, j)[0] + image.at<Vec3b>(i, j)[1] + image.at<Vec3b>(i, j)[2]);
        }
    }
    imshow("Grey", grey);
    return 0;   

}`

我认为Mat Gray在访问for循环中的元素时存在一些问题。

2 个答案:

答案 0 :(得分:2)

您需要初始化grey

Mat grey(image.rows, image.cols, CV_8UC1);

然后,在处理过程中,

    for (int j = 0; j < image.cols; j++)
    {
        grey.at<Vec3b>(i, j) = ((image.at<Vec3b>(i, j)[0] + image.at<Vec3b>(i, j)[1] + image.at<Vec3b>(i, j)[2]))/3;
    }

/3将为您提供 true 灰度值。

HTH

答案 1 :(得分:1)

当然,你还没有初始化它,所以它是空的,你无法访问元素。

Mat grey = Mat::zeros(image.rows, image.cols, CV_8UC1);应该修复它。

在访问Mat

的元素之前尝试使用if语句
if (grey.empty())
{
  std::cout << "Empty Mat!\n";
  return -1;
}

另一件事是添加图像通道不是真正的灰色格式see this