在某些原因,谷歌没有使用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;
}
Run Code Online (Sandbox Code Playgroud)
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
$
Run Code Online (Sandbox Code Playgroud)
OpenCV是2.4.2并且表示assert()是CV_SEQ_ELTYPE( contour ) != CV_32SC2我在我的代码中检查的.如何解决它不确定.
谷歌不会给你很好的例子,你所谈论的所有事情都被弃用了.
cvCalcPGH 新的opencv中不再提供,您可能已经知道,因为您已经包含了旧的库.
此外,它CV_CHAIN_CODE被删除,你不能在新的opencv中使用它.
你应该找到时间将你的代码移植到新的opencv,这是一个趋势,并将得到其他人的更多帮助.
但是,正如旧文档所说,讨论您当前的代码:
CV_CHAIN_CODE - 输出Freeman链码中的轮廓.所有其他方法输出多边形(顶点序列)
输出cvFindContours始终是顶点序列,CV_CHAIN_CODE只是一个例外.这就是cvCalcPGH无法理解这些代码的原因.
而且您可能已经使用其他近似方法测试了代码,您应该已经看到cvCalcPGH了多边形的工作正常.
你应该自己将Freeman代码转换为多边形,然后你可以使用你想要的任何opencv方法.但没有这个,我还没有看到一个可以解释Freeman代码本身的方法.
我不确定应该如何完成这种转换,但是使用下面的代码,这是从Sara Maher Mohammad无耻地窃取的,你可以提取代码并开始自己解释:
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);
}
Run Code Online (Sandbox Code Playgroud)
但同样,我不建议使用已弃用的方法和函数,您可能会找到更好的方法来做您想做的事情.
只是猜测你可能只是想找到两个Freeman代码之间的距离,你可能只是不计算PGH,只是使用其他一些距离函数,就像这里讨论的那样.
| 归档时间: |
|
| 查看次数: |
1619 次 |
| 最近记录: |