Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/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
Opencv cvCalcPGH与cvFindContours的用法_Opencv - Fatal编程技术网

Opencv cvCalcPGH与cvFindContours的用法

Opencv cvCalcPGH与cvFindContours的用法,opencv,Opencv,出于某种原因,谷歌既没有使用cvCalcPGH()的好例子,也没有使用Freeman代码进行轮廓匹配的好例子。所以我试着做到: #include "opencv2/opencv.hpp" #include "opencv2/legacy/legacy.hpp" int main(int argc, char* argv[]) { IplImage* g_gray = cvLoadImage("lisa.png",CV_LOAD_IMAGE_GRAYSCALE);

出于某种原因,谷歌既没有使用cvCalcPGH()的好例子,也没有使用Freeman代码进行轮廓匹配的好例子。所以我试着做到:

#include "opencv2/opencv.hpp"
#include "opencv2/legacy/legacy.hpp"

int
main(int argc, char* argv[]) {

        IplImage* g_gray = cvLoadImage("lisa.png",CV_LOAD_IMAGE_GRAYSCALE);
        cvThreshold( g_gray, g_gray, 100, 255, CV_THRESH_BINARY );

        CvMemStorage* storage=cvCreateMemStorage(0);
        CvSeq* firstContour=NULL;

        int a=cvFindContours(g_gray, storage, &firstContour,sizeof(CvChain),CV_RETR_LIST, CV_CHAIN_CODE);

        CvHistogram *hist;
        int h_bins = 30, s_bins = 30;
        float h_ranges[] = { 0, 180 };
        float s_ranges[] = { 0, 255 };
        int hist_size[] = { h_bins, s_bins };
        float* ranges[] = { h_ranges, s_ranges };

        hist = cvCreateHist( 2, hist_size, CV_HIST_ARRAY, ranges, 1 );
        if( CV_SEQ_ELTYPE( firstContour ) != CV_32SC2 ) {
                printf(":(\n");
        }

        cvCalcPGH((CvSeq *)firstContour,hist);
        return 0;

}
cvFindContours()将按文档说明运行,但cvCalcPGH()将失败:

$ ./calcpgh 
:(
OpenCV Error: Unsupported format or combination of formats (The contour is not valid or the point type is not supported) in cvCalcPGH, file /Users/tonu-samuel/OpenCV-2.4.2/modules/legacy/src/pgh.cpp, line 351
terminate called throwing an exceptionAbort trap: 6
$

OpenCV是2.4.2,指示的assert()用于
CV_SEQ_ELTYPE(轮廓)!=CV_32SC2
我还检查了我的代码。如何解决这个问题还不确定。

谷歌不会给你举好例子的原因是,你所谈论的所有东西都不受欢迎

cvCalcPGH
在新的opencv中不再可用,您可能已经知道,因为您已经包含了旧库

另外,
CV\u-CHAIN\u-code
是,您不能在新的opencv中使用它

你应该找时间把你的代码移植到新的opencv上,这是一个趋势,并且会从其他人那里得到更多的帮助

但是讨论您当前的代码,正如旧文档所说:

CV_链_代码-输出弗里曼链代码中的轮廓。所有其他 方法输出多边形(顶点序列)

cvFindContours
的输出始终是顶点序列,
CV\u CHAIN\u code
只是一个例外。这就是为什么
cvCalcPGH
无法理解这些代码的原因

由于您可能已经用其他近似方法测试了代码,您应该已经看到
cvCalcPGH
可以很好地处理多边形

您应该自己将Freeman代码转换为多边形,然后可以使用任何想要的opencv方法。但如果没有这些,我还没有看到一个方法可以解释弗里曼代码本身

我不确定这种转换到底应该如何进行,但使用下面的代码(不知羞耻地从中窃取),您可以提取代码并开始自己解释:

CvChainPtReader reader;

cvStartReadChainPoints((CvChain*) firstContour, &reader);
for (int i = 0; i < firstContour->total; i++) {
    CV_READ_SEQ_ELEM(reader.code, (*((CvSeqReader*)&(reader))));
    printf("%d \n", reader.code);
}
CvChainPtReader;
cvStartReadChainPoints((CvChain*)第一轮廓和读卡器);
对于(int i=0;itotal;i++){
CV_READ_SEQ_ELEM(reader.code,(*((cvseq reader*)和(reader)));
printf(“%d\n”,reader.code);
}
但是,我不建议您使用不推荐使用的方法和函数,您可以找到更好的方法来完成您想要的任务

只是猜测你可能只是想找到两个Freeman码之间的距离,你可以不去计算PGH,而只是使用一些其他的距离函数,就像前面讨论的那样