Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing 带角点检测的逆图像映射_Image Processing_Computer Vision - Fatal编程技术网

Image processing 带角点检测的逆图像映射

Image processing 带角点检测的逆图像映射,image-processing,computer-vision,Image Processing,Computer Vision,我试图在图像中识别扑克牌。在我使用Canny()成功检测到边缘之后,我知道我必须使用逆透视变换来映射扑克牌以获得直视效果,这样我就可以使用模板匹配来识别扑克牌。角点检测是否是一种可行的方法,用于设计单个或多个卡片的反向透视图?如果是这样的话,什么是一个好的角点检测->逆透视变换技术组合 作为记录,我正试图在我自己的代码中实现这一点,因为这相当于严重依赖OpenCV,但对于实现这一目标的任何指导都将不胜感激。这不是一个简单的答案,只是为了表明我的想法,这一简单的代码有助于理解如何对轮廓进行过滤以便

我试图在图像中识别扑克牌。在我使用Canny()成功检测到边缘之后,我知道我必须使用逆透视变换来映射扑克牌以获得直视效果,这样我就可以使用模板匹配来识别扑克牌。角点检测是否是一种可行的方法,用于设计单个或多个卡片的反向透视图?如果是这样的话,什么是一个好的角点检测->逆透视变换技术组合


作为记录,我正试图在我自己的代码中实现这一点,因为这相当于严重依赖OpenCV,但对于实现这一目标的任何指导都将不胜感激。

这不是一个简单的答案,只是为了表明我的想法,这一简单的代码有助于理解如何对轮廓进行过滤以便于分析

我认为实现一个简单的标识符(对于没有图片的卡片)是可能的,方法是计算卡片轮廓内的计数。(对不起,我的英语很差)

#包括“opencv2/highgui/highgui.hpp”
#包括“opencv2/imgproc/imgproc.hpp”
#包括
使用名称空间cv;
使用名称空间std;
int main(int,字符**argv)
{
Mat src,src_灰色;
src=imread(argv[1]);
if(src.empty())
{

cerr这不是一个简单的答案,只是为了说明我的想法,这个简单的代码有助于理解如何对轮廓进行过滤以便于分析

我认为实现一个简单的标识符(对于没有图片的卡片)是可能的,方法是计算卡片轮廓内的个数

#包括“opencv2/highgui/highgui.hpp”
#包括“opencv2/imgproc/imgproc.hpp”
#包括
使用名称空间cv;
使用名称空间std;
int main(int,字符**argv)
{
Mat src,src_灰色;
src=imread(argv[1]);
if(src.empty())
{

你可以通过分析轮廓而不需要透视变换来识别所有的卡片。如果你分享你的代码来得到特定的图像,我可以给你展示一些改进我的想法的方法(我想看看你的代码能不能理解我的帮助,因为我的想法取决于使用OpenCV C++)。我可以稍后再编写我的代码,但请随意分享您的想法。我可以成功地检测到边缘,但之后我就迷路了。使用OpenCV,您的想法是什么?即使我只是用OpenCV函数概述了过程,我也可以稍后开发自己的代码。我回家后会编写代码。从下一阶段开始,您将如何处理它你可以通过分析轮廓而不需要透视变换来识别所有的卡片。如果你分享你的代码来获得给定的图像,我可以给你展示一些改进我的想法的方法(我想看看你的代码能理解我是否能帮助你,因为我的想法依赖于使用OpenCV C++)。我可以稍后再编写我的代码,但请随意分享您的想法。我可以成功地检测到边缘,但之后我就迷路了。使用OpenCV,您的想法是什么?即使我只是用OpenCV函数概述了过程,我也可以稍后开发自己的代码。我回家后会编写代码。从下一阶段开始,您将如何处理它g Canny Forward?有没有一种方法可以检测像这样的角点?有什么方法可以隔离特定的卡片,例如,如果有多张卡片,我如何知道哪些轮廓代表哪些卡片看向量,或者哪些轮廓实际上代表卡片而不是不同的符号?你是否根据轮廓的大小进行过滤?谢谢r帮助!有没有一种方法可以检测这样的角点?正如你所看到的,红色矩形是用4个角点绘制的。黑色轮廓有它们所在轮廓的信息。我在我自己的代码中有它的工作,但只是为了澄清…ApproxPolyDP查找给定轮廓的角点?所以查找轮廓执行它的名称,然后我想如果你要检查的东西有4个角,并且大于某个像素阈值,那么你已经确定它是一张卡了吗?是的,没错。你可以尝试使用更改的参数值进行ApproxPolyDP。正如我所说,我的代码只是一个起点。如果你分享你的代码,我可以提供更多帮助。要过滤轮廓,你也可以使用角度,正如你所看到的,我认为透视图c校正是不必要的,但看看有没有一种方法可以检测这样的角点?隔离特定卡片的方法是什么,例如,如果有多张卡片,我如何知道哪些轮廓代表哪些卡片在看向量,或者哪些轮廓实际上代表卡片而不是不同的符号?您是否按大小过滤轮廓?谢谢你的帮助!那么有没有办法检测像这样的角点呢?正如你看到的,红色的矩形是用4个角点绘制的。黑色的轮廓有它们所在轮廓的信息。我有自己的代码,但只是为了澄清…ApproxPolyDP查找给定轮廓的角点?所以查找轮廓执行它是名字,然后我想如果你要检查的东西有4个角,并且大于某个像素阈值,那么你就确定它是一张卡了?是的,没错。你可以尝试用更改的参数值ApproxPolyDP。正如我所说,我的代码只是一个起点。如果你共享你的代码,我可以提供更多帮助。要过滤轮廓,你也可以使用角度作为y你可以看到,我认为透视校正是没有必要的,但看看
#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);
}