java - 如何使用 OpenCV 访问两个图像中的每个像素并找到它们的绝对差异? (安卓工作室)

标签 java android android-studio opencv rgba

我有两个 Mat 图像,在 Android Studio 中是 BGRA (8UC4)。我希望能够通过一次遍历每个像素从两个图像中提取 BGRA 像素值,然后找到它们在 RGB 值中的绝对差。我不想减少透明度,所以我不能使用 Core.absdiff()。是否有捷径可寻?我已经使用 mat.get() 和 mat.put() 实现了此功能,但速度非常慢。

我已经看到下面发布的解决方案,但我不太确定它是如何工作的,或者我如何更改它以使用我的图片/所需的功能:

Mat A ;
A.convertTo(A,cvType.CV_16SC3);
int size = (int) (A.total() * A.channels());
short[] temp = new short[size];
A.get(0, 0, temp);
for (int i = 0; i < size; i++)
   temp[i] = (short) (temp[i] / 2);
C.put(0, 0, temp);

我读到的大部分内容都涉及将 Mat 数据放入 Java Primitive 类型。由于我对 Java 和 OpenCV 都很陌生,所以我不太确定这意味着什么?

谢谢

最佳答案

这是一个 C++ 实现。

Mat aBGRA[4];     // array of Mats to hold Blue Green Red Alpha channels
cv::split(A, aBGRA);  // split Mat A into channels
Mat bBGRA[4];
cv::split(B, bBGRA);  // split Mat B into channels
Mat cBGR[3];      // Mat array to hold absolute diff of A and B BGR channels
for ( int idx = 0; idx < 3; ++idx)   // loop BGR channels
{
    cBGR[idx] = Mat::zeros(A.rows, A.cols, CV_8U); 
    Mat diff(aBGRA[idx] != bBGRA[idx]); // create mask where A & B differ
    vector<Point> nonZero;
    cv::findNonZero(diff, nonZero); // collect list of points where A & B differ
    // for each different point in this channel
    for (auto itr = nonZero.begin(); itr != nonZero.end(); ++itr)
    {
       Point p(*itr);
       // set cBGR at point to the absolute difference between A and B at this point
       cBGR[idx].at<uint8_T>(p) = abs(aBGRA[idx].at<uint8_t>(p) - bBGRA[idx].at<uint8_t>(p)); 
    }
}
Mat C;
cv::merge(cBGR, 3, C); // merge BGR channels into C

关于java - 如何使用 OpenCV 访问两个图像中的每个像素并找到它们的绝对差异? (安卓工作室),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44318208/

相关文章:

java - 无法从资源目录加载属性文件

java - 为扫描仪创建专用类是一个有用的输入解决方案吗?

java - jetty :将对象从主要方法传递给servlet

java - 如何比较两个 long 的高 40 位

java - 调用两次dispatchKeyEvent()

android - 为什么Android Studio在单个字母更改并运行后构建整个项目

java - 让简单的 JUnit 测试在 Android Studio 中运行

android - Android OpenCV-在轮廓上绘制矩形

android - 如何在 Android Things 上访问 HardwarePropertiesManager

android - 从IntelliJ/Android Studio运行Gradle时$ PATH设置不正确