如何访问两个图像中的每个像素并使用OpenCV查找它们的绝对差异? (Android Studio)

问题描述:

我在Android Studio中有两个Mat图像,分别是BGRA(8UC4)。我希望能够通过逐个检查每个像素来从两个图像中提取BGRA像素值,然后在RGB值中找到它们的绝对差值。我不想减去透明度,所以我不能使用Core.absdiff()。是否有捷径可寻?我已经使用mat.get()和mat.put()实现了这个功能,但速度非常慢。如何访问两个图像中的每个像素并使用OpenCV查找它们的绝对差异? (Android Studio)

我见过的解决方案贴在下面,但我真的不知道它是如何工作或我如何可以改变它与我的图片/所需功能的工作:

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 
+0

我的问题是特定于Java,因为我使用Android Studio。你介意解释你的代码吗? – ohmygrabovski

+0

对不起,我不知道Java。我添加了注释来解释代码。我认为Java OpenCV具有与C++ OpenCV相同的功能。 –