c++ - 使用opencv从图像中检测三角形和矩形

标签 c++ opencv geometry

我有这个image :

我想从图像中取出三角形和矩形。在下面的代码中,我有 2 种算法,一种用于三角形,另一种用于矩形。但它们非常相似。但是这样我只能把三角形拿出来更亮。谁能帮帮我。

IplImage* DetectAndDrawTriang(IplImage* img){
    CvSeq* contours;
    CvSeq* result;
    CvMemStorage *storage = cvCreateMemStorage(0);
    int d=30;

    IplImage* ret = cvCreateImage(cvGetSize(img), 8, 3);
    IplImage* temp = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
    cvSet(ret,cvScalar(0,0,0));
    cvCvtColor(img, temp, CV_BGR2GRAY);
    cvThreshold( temp, temp, 180, 255, CV_THRESH_BINARY );
    //cvSmooth(temp, temp, CV_GAUSSIAN, 9, 9, 0,0);
    cvNamedWindow("thre");
    cvShowImage("thre", temp);

    cvFindContours(temp, storage, &contours, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));

    while(contours)
    {
        result = cvApproxPoly(contours, sizeof(CvContour), storage, CV_POLY_APPROX_DP, cvContourPerimeter(contours)*0.1, 0);
        if(result->total==3)
        {
            CvPoint *pt[3];
            for(int i=0;i<3;i++)
                pt[i] = (CvPoint*)cvGetSeqElem(result, i);


            if((int)sqrt((pt[0]->x-pt[2]->x)*(pt[0]->x-pt[2]->x)+(pt[0]->y-pt[2]->y)*(pt[0]->y-pt[2]->y))>=d && (int)sqrt((pt[0]->x-pt[1]->x)*(pt[0]->x-pt[1]->x)+(pt[0]->y-pt[1]->y)*(pt[0]->y-pt[1]->y))>=d && (int)sqrt((pt[1]->x-pt[2]->x)*(pt[1]->x-pt[2]->x)+(pt[1]->y-pt[2]->y)*(pt[1]->y-pt[2]->y))>=d)
            {
                cvLine(ret, *pt[0], *pt[1], cvScalar(255,255,255));

                cvLine(ret, *pt[1], *pt[2], cvScalar(255,255,255));

                cvLine(ret, *pt[2], *pt[0], cvScalar(255,255,255));
            }
        }
        contours = contours->h_next;
    }

    cvReleaseImage(&temp);
    cvReleaseMemStorage(&storage);

    return ret;

}

最佳答案

我能想到的一个想法是使用 cv::matchShapes 函数(我建议将 cv2 库与 Mat 而不是 Ipl 图像一起使用)。 matchShapes 获取要检测的对象的 Mat 和要与之比较的对象的 Mat。因此,在您的情况下,您可以制作三角形和正方形轮廓的垫子,并将这些图像与您正在搜索的图像中的每个轮廓进行比较。

您也可以考虑简单地进行模板匹配,因为您的对象是静态的。查看 cv::matchTemplate 及其与上一段几乎相同的想法。

关于c++ - 使用opencv从图像中检测三角形和矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13628329/

相关文章:

android - 有没有一种有效的方法来确定图像在指定颜色范围内的百分比? (在 Android 的 OpenCV 中)

android - OpenCV layout.xml 命名空间未绑定(bind)

c# - 找到完全覆盖矩形集所需的最少固定大小矩形的算法

math - 找到圆上的切点?

带类的 C++ 指针

c++ - 将 MS HANDLE 初始化为 nullptr 是否安全?

python - 将来自相机的帧写入 OpenCV 中的单个图像

3d - 将 3d 平面上的点转换为 2d 坐标

c++ - 模板转换运算符 C++

c++ - 在 C++ 中验证输入