如何访问两个图像中的每个像素并使用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
我的问题是特定于Java,因为我使用Android Studio。你介意解释你的代码吗? – ohmygrabovski
对不起,我不知道Java。我添加了注释来解释代码。我认为Java OpenCV具有与C++ OpenCV相同的功能。 –