- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
由于某些原因,谷歌没有使用 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( contour ) != CV_32SC2
我也在我的代码中检查。不确定如何解决。
最佳答案
谷歌不会给你很好的例子的原因是你正在谈论的所有事情都被弃用了。
cvCalcPGH
在新的 opencv 中不再可用,您可能已经知道它包含了遗留库。
CV_CHAIN_CODE
也是 removed你不能在新的 opencv 中使用它。
你应该找时间将你的代码移植到新的 opencv 上,它正在流行并且会得到其他人的更多帮助。
但是讨论您当前的代码,正如旧文档所说:
CV_CHAIN_CODE - outputs contours in the Freeman chain code. All other methods output polygons (sequences of vertices)
cvFindContours
的输出总是顶点序列,CV_CHAIN_CODE
只是一个异常(exception)。这就是 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);
}
但再次声明,我不建议使用已弃用的方法和函数,您可能会找到更好的方法来完成您想要的事情。
只是猜测您可能只想找到两个弗里曼代码之间的距离,您可能只是不计算 PGH,而是使用一些其他距离函数,如讨论的 here .
关于opencv - cvCalcPGH 与 cvFindContours 的结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11859086/
由于某些原因,谷歌没有使用 cvCalcPGH() 的好例子,也没有其他使用 Freeman 代码进行轮廓匹配的好例子。所以我试着做到: #include "opencv2/opencv.hpp" #
我是一名优秀的程序员,十分优秀!