opencv链码。不能将参数 1 从“CvSeqReader”转换为“CvChainPtReader *”

qq_32343917 2015-12-02 04:34:56
各位大神,opencv链码问题,急求啊。
这个不能将参数 1 从“CvSeqReader”转换为“CvChainPtReader * ” 怎么改啊?改了好久都没改出来。谢谢了,急啊~


#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/core/core.hpp>
#include<iostream>
#include <string>
#include<stdio.h>
#include<math.h>
#include<vector>
using namespace cv;
using namespace std;

int main( int argc, char** argv )
{
cvNamedWindow("a", 1);
IplImage* img_8uc1 = cvLoadImage("1000.jpg", CV_LOAD_IMAGE_GRAYSCALE );
IplImage* img_edge = cvCreateImage( cvGetSize(img_8uc1), 8, 1 );
IplImage* img_8uc3 = cvCreateImage( cvGetSize(img_8uc1), 8, 3 );

cvThreshold( img_8uc1, img_edge, 100, 255, CV_THRESH_BINARY );

CvMemStorage* storage = cvCreateMemStorage();//采用默认大小,即:0.

CvSeq* first_contour = NULL;

int Nc = cvFindContours(img_edge,storage,&first_contour,sizeof(CvChain),
CV_RETR_LIST,
CV_CHAIN_CODE///*这个是关键参数*/
);


CvChain* chain = 0;
for( CvSeq* c = first_contour; c != NULL; c=c->h_next )
{
CvSeqReader reader;
int i, total = c->total;
cvStartReadSeq( (CvSeq*)c, &reader, 0 );

for( i = 0; i < total; i++ )
{
char code;
CV_READ_SEQ_ELEM( code, reader ); printf(" %d: \n",code); //得到轮廓的Freeman链码序列


CvPoint point;


point=cvReadChainPoint(reader);//不能将参数 1 从“CvSeqReader”转换为“CvChainPtReader *”


printf(" x=%d ;y=%d: \n",point.x,point.y);//得到链码坐标点。
}


}
printf("Finished all contours.\n");

cvCvtColor(img_8uc1, img_8uc3, CV_GRAY2BGR);
cvShowImage("a", img_8uc3 );
cvWaitKey(0);
cvReleaseMemStorage(&storage);//释放
cvDestroyWindow("a");
cvReleaseImage(&img_8uc1);
cvReleaseImage(&img_edge);
cvReleaseImage(&img_8uc3);
return 0;
}
...全文
434 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
JackPat_X 2016-02-23
  • 打赏
  • 举报
回复
正需要,学习了,非常感谢
qq_32343917 2016-01-11
  • 打赏
  • 举报
回复
谢谢啦,虽然结果不怎么对,但的确可以运行了,感激。
晒月光的青蛙 2015-12-24
  • 打赏
  • 举报
回复
你的code我debug了一下,改成下面这样可以工作

int main( int argc, char** argv )
{
	cvNamedWindow("a", 1);
	IplImage* img_8uc1 = cvLoadImage("1000.jpg", CV_LOAD_IMAGE_GRAYSCALE);
	IplImage* img_edge = cvCreateImage(cvGetSize(img_8uc1), 8, 1);
	IplImage* img_8uc3 = cvCreateImage(cvGetSize(img_8uc1), 8, 3);	

	cvThreshold(img_8uc1, img_edge, 128, 255, CV_THRESH_BINARY);	

	CvMemStorage* storage = cvCreateMemStorage();//采用默认大小,即:0.

	CvChain* first_contour = NULL;

	int Nc = cvFindContours(img_edge, storage, (CvSeq **)&first_contour, sizeof(CvChain),
		CV_RETR_LIST,
		CV_CHAIN_CODE///*这个是关键参数*/
		);

	for (CvChain* c = first_contour; c != NULL; c = (CvChain *)c->h_next)
	{
		//CvSeqReader reader;
		CvChainPtReader reader;
		int i, total = c->total;
		//cvStartReadSeq((CvSeq*)c, &reader, 0);
		cvStartReadChainPoints ( c, &reader );

		for (i = 0; i < total; i++)
		{
			char code;
			CV_READ_SEQ_ELEM(code, reader);    printf(" %d: \n", code);       //得到轮廓的Freeman链码序列

			CvPoint point;
			point = cvReadChainPoint( &reader );//不能将参数 1 从“CvSeqReader”转换为“CvChainPtReader *”

			printf(" x=%d ;y=%d: \n", point.x, point.y);//得到链码坐标点。
		}
	}
	printf("Finished all contours.\n");

	cvCvtColor(img_8uc1, img_8uc3, CV_GRAY2BGR);
	cvShowImage("a", img_8uc3 );
	cvWaitKey(0);
	cvReleaseMemStorage(&storage);//释放
	cvDestroyWindow("a");
	cvReleaseImage(&img_8uc1);
	cvReleaseImage(&img_edge);
	cvReleaseImage(&img_8uc3);
	return 0;
}

4,497

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧