0

画像バッファーのポインターを渡し、彩度を変更して、結果をすぐに確認したいと考えています。しかし、変更は私のバッファに適用されておらず、変更されていません。

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

}

バッファーに変更を適用するにはどうすればよいですか?

4

2 に答える 2

1

問題を再現しようとしたときにコードをリファクタリングし、その過程で修正しました。ソースを 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);
}
于 2013-05-02T14:56:11.470 に答える
0

コンストラクターは、 のサイズで、 が指す位置にMat matObject(width, height, CV_8UC4, buffer);割り当てます。matObjectwidthheightbuffer

あなたの関数newMatでは、 から複製された に変更を加えていmatObjectます。ただし、bufferを指していませんnewMat。それは を指してmatObjectおりmatObject、関数によって変更されません。

于 2013-05-02T14:48:31.403 に答える