微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将RGB2CMYK方法从c移植到java

我试图将方法从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的方法.这里有一些细节:

>我没有在java中找到CV_Assert方法.不知道任何替补
为了那个原因.
> cmyk.push_back替换为cmyk [i] .pushback
>我已经用Mat替换cv :: Vec3b,它没有显示错误
> std :: max被Math.max替换
>问题是分配给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,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;
        }
    }
}

解决方法

您必须确保Matyk数组的大小为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,new Float[] {(1 - g - k) / (1 - k)});
cmyk[2].put(i,new Float[] {(1 - b - k) / (1 - k)});
cmyk[3].put(i,new Float[] {k});

…希望这可以帮助

原文地址:https://www.jb51.cc/css/217211.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。