opencv画面抖动检测

//static cv::Mat lastMat = Mat();
//static int similarityCount = 0;

int getSimilarity(const Mat &matROI_IDCard, const Mat &lastMat) {
Mat matDst1, matDst2;

resize(matROI_IDCard, matDst1, Size(8, 8), 0, 0, INTER_CUBIC);
resize(lastMat, matDst2, Size(8, 8), 0, 0, INTER_CUBIC);
cvtColor(matDst1, matDst1, COLOR_BGR2GRAY);
cvtColor(matDst2, matDst2, COLOR_BGR2GRAY);

int iAvg1 = 0, iAvg2 = 0;
int arr1[64], arr2[64];

for (int i = 0; i < 8; i++) {
uchar *data1 = matDst1.ptr<uchar>(i);
uchar *data2 = matDst2.ptr<uchar>(i);

int tmp = i * 8;

for (int j = 0; j < 8; j++) {
int tmp1 = tmp + j;

arr1[tmp1] = data1[j] / 4 * 4;
arr2[tmp1] = data2[j] / 4 * 4;

iAvg1 += arr1[tmp1];
iAvg2 += arr2[tmp1];
}
}

iAvg1 /= 64;
iAvg2 /= 64;

for (int i = 0; i < 64; i++) {
arr1[i] = (arr1[i] >= iAvg1) ? 1 : 0;
arr2[i] = (arr2[i] >= iAvg2) ? 1 : 0;
}

int iDiffNum = 0;

for (int i = 0; i < 64; i++) {
if (arr1[i] != arr2[i]) {
++iDiffNum;
}
}
return iDiffNum;
}



///////////////////////////////////////////////////////////

if (lastMat.rows > 0) {

int iDiffNum = getSimilarity(matROI_IDCard, lastMat);

if (iDiffNum > 10) {
result += "画面抖动,请拿稳手机" + getString(iDiffNum);
lastMat = matROI_IDCard;
similarityCount = 0;
return env->NewStringUTF(result.c_str());
} else {
similarityCount++;
if(similarityCount < 2)
{
result += "画面抖动,请拿稳手机" + getString(iDiffNum);
//lastMat = matROI_IDCard;
return env->NewStringUTF(result.c_str());
}
}
}

similarityCount = 0;
lastMat = matROI_IDCard;
posted @ 2017-10-13 14:40  飞晨信息  阅读(1838)  评论(0)    收藏  举报