我正在尝试识别图像中的扑克牌。在使用Canny(http://imgur.com/a/l4Kjd)成功检测到边缘后,我知道我必须使用逆透视变换将扑克牌映射为直观,以便我可以使用模板匹配来识别卡片。角点检测是设计单个或多个卡的逆透视的可行方法吗?如果是这样,什么是一个好的角点检测 - >逆透视变换技术组合应用?
为了记录,我正在尝试在我自己的代码中实现这一点,因为我们非常依赖OpenCV,但是对于实现这一目标的任何指导都将不胜感激。
答案 0 :(得分:0)
这不是一个完整的答案,只是为了表明我的想法这个简单的代码有助于理解如何过滤轮廓以便轻松分析。
我认为通过计算卡片轮廓内的计数器,可以实现一个简单的标识符(用于无图片卡片)。 (抱歉我的英语不好)
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
using namespace cv;
using namespace std;
int main( int, char** argv )
{
Mat src,src_gray;
src = imread(argv[1]);
if (src.empty())
{
cerr << "No image supplied ..." << endl;
return -1;
}
cvtColor( src, src_gray, COLOR_BGR2GRAY );
src_gray = src_gray <127;
// to simplicify contours
dilate(src_gray,src_gray,Mat(),Point(-1,-1),2);
erode(src_gray,src_gray,Mat(),Point(-1,-1),10);
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
vector<Point> approx;
findContours( src_gray, contours, RETR_LIST, CHAIN_APPROX_SIMPLE );
src = Scalar(255,255,255);
int counter = 0;
for( size_t i = 0; i< contours.size(); i++ )
{
approxPolyDP(contours[i],approx,15,true);
Scalar color;
if( approx.size() == 4 & contourArea(approx) > 5000 )
color = Scalar(0,0,255);
{
drawContours(src,contours,i,Scalar(0,255,0),1, LINE_AA, hierarchy, 1);
polylines(src,approx,true,color);
if( approx.size() == 3 ) counter++;
}
}
putText(src, format("%d",counter), Point(100, 100),FONT_HERSHEY_SIMPLEX, 2, Scalar(255,0,0), 4);
imshow( "result", src );
waitKey(0);
return(0);
}
结果图片:
编辑:代码已更新