这篇文章主要介绍“Opencv图色识别的用法”,在日常操作中,相信很多人在Opencv图色识别的用法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Opencv图色识别的用法”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
10年积累的成都网站建设、成都做网站经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先做网站后付款的网站建设流程,更有噶尔免费网站建设让你可以放心的选择与我们合作。
最近研究了一下图色识别,想用opencv测试一下,这里记录一下过程。
参考网上的教程主要使用matchTemplate这个函数,看一下python的版本
两张图片:
生成图片
可以看到通过模板(第一张图)准确的匹配出了在第二张图中的位置,我们改一下代码打印一下时间
性能确实强劲,整个图片扫描和过滤阀值使用了5毫秒左右
考虑的实际部署可能使用c++,顺便测试一下
#include
#include
#include
#include
using namespace std;
using namespace cv;
const char *image_window = "Source Image";
const char *templ_window = "Templ window";
void matchingMethod(Mat &img, Mat &templ);
int main(int argc, char **argv)
{
Mat img = imread(argv[1], IMREAD_GRAYSCALE);
Mat templ = imread(argv[2], IMREAD_GRAYSCALE);
matchingMethod(img, templ);
waitKey(0);
return 0;
}
void matchingMethod(Mat &img, Mat &templ)
{
TickMeter tm;
cout << "开始...\n";
tm.start();
Mat result;
matchTemplate(img, templ, result, 5);
int cols = templ.cols;
int rows = templ.rows;
int width = result.cols;
float *ip = (float *)result.data;
for (int i = 0, ilenght = result.rows; i < ilenght; i++)
{
for (int j = 0, jlenght = result.cols; j < jlenght; j++)
{
int index = i * width + j;
if (ip[index] >= 0.8) //大于0.8视为命中
{
Point p1 = Point(j, i);
Point p2 = Point(j + cols, i + rows);
rectangle(img, p1, p2, Scalar::all(255), 1, 1, 0);
}
}
}
tm.stop();
cout << "花费时间: " << tm.getTimeMilli() << "ms" << endl;
cout << "结束.\n";
imshow(image_window, img);
imshow(templ_window, templ);
}
由于在c++里面不能使用numpy库,所以在阀值过滤的时候使用了双重for循环,也尝试过其他函数发现要在矩阵里面过滤阀值直接获取索引的函数我没有找到(对于并行操作来说这样两个for循环肯定效率很低),后面找到了再补充,运行看一下效果:
编译,使用-O2优化:
g++ -std=c++11 -O2 main.cpp -o main `pkg-config --cflags –libs opencv4`
看一下效果
时间跟python差不多,如果去掉rectangle应该是要比python快的,如果能够把阀值过滤通过矩阵的方式操作应该时间会更短。
到此,关于“Opencv图色识别的用法”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!
售后响应及时
7×24小时客服热线数据备份
更安全、更高效、更稳定价格公道精准
项目经理精准报价不弄虚作假合作无风险
重合同讲信誉,无效全额退款