OpenCV Mat 图像转黑白错误

Posted

技术标签:

【中文标题】OpenCV Mat 图像转黑白错误【英文标题】:OpenCV Mat image to black and white error 【发布时间】:2016-05-01 13:35:52 【问题描述】:

我正在尝试处理目录中的图像,使其成为黑白(灰度),然后将其写入另一个文件。我已经使用 OpenCV 的 C 库完成了,这里是代码

#include <opencv2/opencv.hpp>
using namespace std;

void faktorial(int InSize, uchar *DataIn, uchar *DataOut)

    for (int i = 0, j = 0; i < InSize; i += 3, j++)
    
        DataOut[j] = (DataIn[i] + DataIn[i + 1] + DataIn[i + 2]) / 3;
    



int main()

    char tbLEN[] = "Assassin.jpg";

    IplImage* image;
    image = cvLoadImage(tbLEN, 1);

    IplImage *image2 = cvCreateImage(cvSize(image->width, image->height), IPL_DEPTH_8U, 1);

    int height1 = image->height;
    int width1 = image->width;
    int step = image->widthStep;
    int SizeIn = step*height1;
    int nChannels = image->nChannels;
    uchar* DatIn = (uchar*)image->imageData;
    uchar* DatOut = (uchar*)image2->imageData;

    faktorial(SizeIn, DatIn, DatOut);

    cvNamedWindow("Imagecolor");
    cvShowImage("Imagecolor", image);

    cvNamedWindow("Gray");
    cvShowImage("Gray", image2);
    cvWaitKey(0);
    return 0;

它工作得非常好,但由于 C OpenCV 已经过时,我试图用 C++ 做同样的事情,但输出图像与我的预期完全不同。错误在哪里?另外,当使用 Mat img2(img.rows,img.cols, CV_8UC3) 创建空图像时,我做得对吗?

这是代码。

void faktorial(int InSize, uchar *DataIn, uchar *DataOut)

    for(int i = 0,  j = 0; i < InSize; i += 3, j++)
    
        DataOut[j] = (DataIn[i] + DataIn[i + 1] + DataIn[i + 2]) / 3;
    



int main()

        Mat img = imread("Assassin.jpg", CV_LOAD_IMAGE_UNCHANGED);
        if (img.empty())
     
          cout << "Error : Image cannot be loaded..!!" << endl;
          return -1;
     

        uchar* DataImg = img.data;

        int Width = img.cols;
        int Height = img.rows;
        int Step = img.step;
        int SizeInImg = Step * Height;
        Mat img2(img.rows,img.cols, CV_8UC3);
        uchar* DataImg2 = img2.data;
        faktorial(SizeInImg, DataImg, DataImg2);


     namedWindow("MyWindow", CV_WINDOW_AUTOSIZE);
     imshow("MyWindow", img2);

输入

输出

【问题讨论】:

【参考方案1】:

问题来了

Mat img2(img.rows,img.cols, CV_8UC3);

应该是

Mat img2(img.rows,img.cols, CV_8UC1);

你应该使用CV_LOAD_IMAGE_COLOR而不是CV_LOAD_IMAGE_UNCHANGED

Mat img = imread(argv[1], CV_LOAD_IMAGE_COLOR);

【讨论】:

以上是关于OpenCV Mat 图像转黑白错误的主要内容,如果未能解决你的问题,请参考以下文章

将 Mat 图像转置为更大的 Mat 图像,Opencv

OpenCV彩色图像转灰的烦恼

opencv QImage与Mat 互转 及简单的图像处理

使用 OpenCV C++ 从黑白图像中提取四边形的角(极端角点)

LIBTIFF 16位灰度tif图像转成OpenCV中的Mat格式并显示

opencv 数据类型转换:CvArr, Mat, CvMat, IplImage, BYTE 转