将图像缓冲区的指针传递给OpenCV并改变饱和度

pass the pointer of image buffer to OpenCV and change the saturation?

本文关键字:OpenCV 改变 饱和度 图像 缓冲区 指针      更新时间:2023-10-16

我想传递我的图像缓冲区的指针,改变饱和度,并立即看到结果。但是这个变化并没有应用到我的缓冲区中,它没有改变。

void changeSaturation(void* buffer,int width, int height)
{
  Mat matObject(width, height, CV_8UC4, buffer);
  m_matSource = matObject;
  Mat newMat = m_matSource.clone();
  // BGR to HSV
  cvtColor(matSource, matSource, CV_BGR2HSV);
  for(int i = 0; i < newMat.rows; ++i)
   {
     for(int j = 0; j < newMat.cols; ++j)
     {
        newMat.at<cv::Vec3b>(i, j)[1] = 255; //saturationValue;
     }
   }
// HSV back to BGR
 cvtColor(newMat, m_matSource, CV_HSV2BGR); // here m_matSource->data change

}

如何将更改应用到缓冲区?

我重构你的代码时,试图重现你的问题,并在此过程中我修复了它。您将源代码克隆到newMat中,然后更改了原始图像的颜色空间,然后继续完全忽略修改后的新图像。试一下:

void changeSaturation(Mat& image)
{
    Mat result(image.rows, image.cols, image.type());
    // BGR to HSV
    cvtColor(image, result, CV_BGR2HSV);
    for(int i = 0; i < result.rows; ++i)
    {
        for(int j = 0; j < result.cols; ++j)
            result.at<cv::Vec3b>(i, j)[1] = 255; //saturationValue;
    }
// HSV back to BGR
    cvtColor(result, result, CV_HSV2BGR); // here m_matSource->data change
    namedWindow("Original");
    imshow("Original",image);
    namedWindow("Duplicate");
    imshow("Duplicate",result);
}

int main()
{
    Mat image;
    image = imread("C:/Users/Public/Pictures/Sample Pictures/Desert.jpg");
    changeSaturation(image);
    waitKey(0);
}

编辑

修改输入图像:

void changeSaturation(Mat& image)
{
    // BGR to HSV
    cvtColor(image, image, CV_BGR2HSV);
    for(int i = 0; i < image.rows; ++i)
    {
        for(int j = 0; j < image.cols; ++j)
            image.at<cv::Vec3b>(i, j)[1] = 255; //saturationValue;
    }
    // HSV back to BGR
    cvtColor(image, image, CV_HSV2BGR); // here m_matSource->data change
}
下编辑

现在(几乎)具有原始函数签名:

void changeSaturation(uchar* buffer, int rows, int cols, int type)
{
    Mat image(rows, cols, type, buffer);
    Mat result;
    // BGR to HSV
    cvtColor(image, result, CV_BGR2HSV);
    for(int i = 0; i < result.rows; ++i)
    {
        for(int j = 0; j < result.cols; ++j)
            result.at<cv::Vec3b>(i, j)[1] = 255;
    }
    // HSV back to BGR
    cvtColor(result, image, CV_HSV2BGR);
}
int main()
{
    Mat image;
    image = imread("C:/Users/Public/Pictures/Sample Pictures/Desert.jpg");
    changeSaturation(image.data, image.rows, image.cols, image.type());
    imshow("Original",image);
    waitKey(0);
}

您的构造器Mat matObject(width, height, CV_8UC4, buffer);buffer所指向的位置分配大小为widthheightmatObject

在你的函数中,你正在修改newMat,它是从matObject克隆而来的。但是,buffer不指向newMat,它指向matObject,并且matObject不会被函数更改。