我有32张字母卡,如OSMO应用程序(https://www.playosmo.com/en/words/(。
我想在图像中或在相机的框架中实时识别它们 我想要这个适用于安卓设备
的应用程序,所以我为此目的使用了 opencv 和 c++。
我尝试
的方法是
- 首先,我使用筛选和冲浪以及球体来获取关键点,并将它们与卡片的静态图片进行比较
- 第二种方法是K最近邻。我训练一些图片并制作两个xml文件,其中一个包含二进制模式下所有训练图像的像素,另一个是分类文件,它是训练图像的地图。
第一种方法有一个问题,即关键点可以实时更改并且不是唯一的。 所以匹配关键点并不好。
第二个方法是Android设备中的XML文件加载时间太长。
所以现在我需要帮助
,有没有快速可靠的方法?我该怎么办?
最后我找到了一种方法来检测五月卡片
中的字母,以识别我使用 Hu 时刻
的卡片中的字母,这有点像匹配形状,但它更准确
https://www.learnopencv.com/shape-matching-using-hu-moments-c-python/
下面的代码重新运行一个双精度,这是两个图像之间的不同,所以我使用不同的并将其与其他图像进行比较,然后识别图像
中的字母。
double HuMatchingShape(double* secondMoments,double* firstMoments)
{
double dif = 0;
int counter = 0;
for (int i = 0; i < 7; i++)
{
dif += (firstMoments[i] - secondMoments[i]) * (firstMoments[i] -secondMoments[i]);
}
return sqrt(dif);
}
double* getHuMoments(Mat img)
{
Moments moments = cv::moments(img,true);
// Calculate Hu Moments
double * huMoments = new double[7];
HuMoments(moments, huMoments);
for (int i = 0; i < 7; i++)
{
huMoments[i] = -1 * copysign(1.0, huMoments[i]) * log10(abs(huMoments[i]));
}
return huMoments;
}
int main()
{
Mat image1 = imread("image path");
Mat image2 = imread("second image path");
// make these two images binary
image1 = makeItBinay(image1);
image2 = makeItBinay(image2);
// calculate different between two image with hu moments
double different = HuMatchingShape(getHuMoments(image1), getHuMoments(image2));
return 0;
}