将RGB2CMYK方法从c++移植到java时遇到麻烦
trouble porting RGB2CMYK method from c++ to 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
,显示没有错误 - 问题是分配给
cmyk[0].at<float>(i,j)
std::max
替换为Math.max
谁有建议或更好的方法来改变这个方法到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)。
相关文章:
- 编译包含字符串的代码时遇到问题
- 遇到新行时,有没有办法停止istream_iterator
- 在java中解决这段代码时面临循环中的问题
- 尝试用java代码编译和运行c++代码
- 在使用GPU支持编译Tensorflow时,会遇到CUDA_TOOLKIT_PATH未绑定变量
- 如何在C++向量中奇数元素前面加上值-1,我在使用insert函数时遇到了问题
- 在 for 循环中查找问题时遇到困难
- 在这种情况下,java对象是否可以调用本机函数
- 创建结构的数组时遇到分段错误
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- 在java中读取c++字节的位字段
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- 为什么我遇到分段错误?
- 使用已使用 java 编码的 openssl 解码数据
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- 这些是什么样的错误?即使我不在 Linux 上工作,我也遇到了 Linux 错误
- SWIG Java 在使用 -DSWIGWORDSIZE64 时将int64_t转换为 jlong
- 为什么我在尝试模板时遇到视觉工作室C++错误
- 简单的 Java 代码,在创建等效C++(私有静态成员和公共访问器方法)时遇到问题
- 将RGB2CMYK方法从c++移植到java时遇到麻烦