我试图将方法从c转换为java.这是方法:
@H_404_24@解决方法
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)
提前感谢帮助….
编辑
我做了什么
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循环中,我建议你使用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});
…希望这可以帮助