如何在 OpenCv 中将 cv::Mat 转换为灰度

How can I convert a cv::Mat to a gray scale in OpenCv?

本文关键字:Mat 转换 灰度 cv OpenCv 中将      更新时间:2023-10-16

如何将cv::Mat转换为灰度?

我正在尝试从opencv运行drawKeyPoints函数,但是我遇到了断言归档错误。我的猜测是,它需要接收参数中的灰度图像而不是彩色图像。

void SurfDetector(cv::Mat img){
vector<cv::KeyPoint> keypoints;
cv::Mat featureImage;
cv::drawKeypoints(img, keypoints, featureImage, cv::Scalar(255,255,255) ,cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
cv::namedWindow("Picture");
cv::imshow("Picture", featureImage);

}

使用 C++ API,函数名称略有更改,现在写入:

#include <opencv2/imgproc/imgproc.hpp>
cv::Mat greyMat, colorMat;
cv::cvtColor(colorMat, greyMat, CV_BGR2GRAY);

主要困难在于该功能在 imgproc 模块中(而不是在核心中),并且默认情况下 cv::Mat 采用蓝绿红 (BGR) 顺序,而不是更常见的 RGB。

OpenCV 3

从OpenCV 3.0开始,还有另一种约定。转换代码嵌入在命名空间cv::中,并以 COLOR 为前缀。因此,示例变为:

#include <opencv2/imgproc/imgproc.hpp>
cv::Mat greyMat, colorMat;
cv::cvtColor(colorMat, greyMat, cv::COLOR_BGR2GRAY);

据我所知,包含的文件路径没有改变(这不是错字)。

可能对

迟到者有所帮助。

#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
using namespace cv;
using namespace std;
int main(int argc, char *argv[])
{
  if (argc != 2) {
    cout << "Usage: display_Image ImageToLoadandDisplay" << endl;
    return -1;
}else{
    Mat image;
    Mat grayImage;
    image = imread(argv[1], IMREAD_COLOR);
    if (!image.data) {
        cout << "Could not open the image file" << endl;
        return -1;
    }
    else {
        int height = image.rows;
        int width = image.cols;
        cvtColor(image, grayImage, CV_BGR2GRAY);

        namedWindow("Display window", WINDOW_AUTOSIZE);
        imshow("Display window", image);
        namedWindow("Gray Image", WINDOW_AUTOSIZE);
        imshow("Gray Image", grayImage);
        cvWaitKey(0);
        image.release();
        grayImage.release();
        return 0;
    }
  }
}