将RGB2CMYK方法从c++移植到java时遇到麻烦

trouble porting RGB2CMYK method from c++ to java

本文关键字:java 遇到 麻烦 RGB2CMYK 方法 c++      更新时间:2023-10-16

我正在尝试将方法从c++转换为java。方法如下:

void rgb2cmyk(cv::Mat& src, std::vector<cv::Mat>& cmyk)
{
    CV_Assert(src.type() == CV_8UC3);
    cmyk.clear();
    for (int i = 0; i < 4; ++i)
       cmyk.push_back(cv::Mat(src.size(), CV_32F));
    for (int i = 0; i < src.rows; ++i)
    {
        for (int j = 0; j < src.cols; ++j)
        {
            cv::Vec3b p = src.at<cv::Vec3b>(i,j);
            float r = p[2] / 255.;
            float g = p[1] / 255.;
            float b = p[0] / 255.;
            float k = (1 - std::max(std::max(r,g),b));
            cmyk[0].at<float>(i,j) = (1 - r - k) / (1 - k); 
            cmyk[1].at<float>(i,j) = (1 - g - k) / (1 - k);
            cmyk[2].at<float>(i,j) = (1 - b - k) / (1 - k);
            cmyk[3].at<float>(i,j) = k;
        }
    }
}

问题在于OpenCv的方法。下面是一些细节:

  1. 我没有在java中找到CV_Assert方法。我不知道还有其他选择。
  2. cmyk.push_back替换为cmyk[i].pushback
  3. 我用Mat代替cv::Vec3b,显示没有错误
  4. std::max替换为Math.max
  5. 问题是分配给cmyk[0].at<float>(i,j)

谁有建议或更好的方法来改变这个方法到java ?

提前感谢帮助....

编辑

我做了什么

public void rgb2xmyk(Mat src,Mat[] cmyk)
{
    //CV_Assert(src.type() == CV_8UC3);
    //cmyk.clear();
    for (int i = 0; i < 4; ++i)
        cmyk[i].push_back(new Mat(src.size(), CvType.CV_32F));
    for (int i = 0; i < src.rows; ++i)
    {
         for (int j = 0; j < src.cols; ++j)
         {
             double[] p = src.get(i,j);
             float r = (float) (p[2] / 255.);
             float g = (float) (p[1] / 255.);
             float b = (float) (p[0] / 255.);
             float k = (1 - Math.max(Math.max(r,g),b));
             cmyk[0].at<float>(i,j) = (1 - r - k) / (1 - k); 
             cmyk[1].at<float>(i,j) = (1 - g - k) / (1 - k);
             cmyk[2].at<float>(i,j) = (1 - b - k) / (1 - k);
             cmyk[3].at<float>(i,j) = k;
        }
    }
}

您必须确保Mat的cmyk数组的size=4。在for循环中,我建议您使用setTo:

for (int i = 0; i < 4; ++i)
    cmyk[i].setTo(new Mat(src.size(), CvType.CV_32F));

在嵌套的for循环中,在填充cmyk的地方,我会使用put方法

cmyk[0].put(i,j,new Float[] {(1 - r - k) / (1 - k)});
cmyk[1].put(i,j,new Float[] {(1 - g - k) / (1 - k)});
cmyk[2].put(i,j,new Float[] {(1 - b - k) / (1 - k)});
cmyk[3].put(i,j,new Float[] {k});

…希望对大家有所帮助

您可以在这行看到:

cmyk[0].at<float>(i,j) = (1 - r - k) / (1 - k); 

结果在转换为浮点数之前被处理为整型,因为每个块开始都是整数。试一试:

cmyk[0].at<float>(i,j) = (1.0f - r - k) / (1.0f - k);

我认为你已经有一个明智的答案,如何访问数组中的元素虽然(通过.put)。