从C++;到C 我有一个C++ OpenCV代码,我需要转换成C,但是我找不到一个指南来检查我应该使用什么而不是< /p>
cvScalar、cvNamedWindow、cvSmooth 另外,如果你在我的代码中发现任何其他问题,你能告诉我吗从C++;到C 我有一个C++ OpenCV代码,我需要转换成C,但是我找不到一个指南来检查我应该使用什么而不是< /p>,c++,c,opencv,C++,C,Opencv,cvScalar、cvNamedWindow、cvSmooth 另外,如果你在我的代码中发现任何其他问题,你能告诉我吗 #include "cv.h" #include "highgui.h" #include "cxcore.h" #include <stdio.h> IplImage* Threshold(IplImage* src) { IplImage* srcHSV = cvCreateImage(cvGetSize(src), 8, 3); cvCv
#include "cv.h"
#include "highgui.h"
#include "cxcore.h"
#include <stdio.h>
IplImage* Threshold(IplImage* src)
{
IplImage* srcHSV = cvCreateImage(cvGetSize(src), 8, 3);
cvCvtColor(src, srcHSV, CV_BGR2HSV);// Convert the BGR to HSV
IplImage* Thresholdimg = cvCreateImage(cvGetSize(src), 8, 1); // create a Threshold image
// HSV tresholding
cvInRangeS(srcHSV, CvScalar(7, 107, 219), CvScalar(11,148,255), Thresholdimg);
cvSmooth( Thresholdimg, Thresholdimg, CV_GAUSSIAN, 9, 9 ); // Smoothing with a Gaussian filter (9*9 kernel)
cvReleaseImage(&srcHSV);
return Thresholdimg;
}
int main()
{
CvCapture* capture = 0;
capture = cvCaptureFromCAM(1);// 1 for usb webcam, 0 o/w.
if(!capture)
{
printf("Can not capture,no device found\n");
return -1;
}
// Windows for Threshold and Output
cvNamedWindow("Tracking output");
cvNamedWindow("Threshold");
while(1) // infinite loop
{
IplImage* frame = 0;
frame = cvQueryFrame(capture); // decompress the captured frame
if(!frame)
break;
IplImage* finalthreshold = Threshold(frame);
cvShowImage("Threshold", finalthreshold);//show the thresholded image
CvMemStorage* storage = cvCreateMemStorage(0);// allocate memory to store the contour information
CvSeq* circles = cvHoughCircles(finalthreshold, storage, CV_HOUGH_GRADIENT, 2, finalthreshold->height/4, 100, 40, 20, 200);
int i;
for (i = 0; i < circles->total; i++)
{
float *p = (float*)cvGetSeqElem(circles, i);
printf("Ball! x=%f y=%f r=%f\n\r",p[0],p[1],p[2] );
CvPoint center = cvPoint(cvRound(p[0]),cvRound(p[1]));
CvScalar val = cvGet2D(finalthreshold, center.y, center.x);
if (val.val[0] < 1) continue;
cvCircle(frame, center, 3, CV_RGB(0,255,0), -1, CV_AA, 0);
cvCircle(frame, center, cvRound(p[2]), CV_RGB(255,0,0), 3, CV_AA, 0);
cvCircle(finalthreshold, center, 3, CV_RGB(0,255,0), -1, CV_AA, 0);
cvCircle(finalthreshold, center, cvRound(p[2]), CV_RGB(255,0,0), 3, CV_AA, 0);
}
cvShowImage("Tracking output", frame);
int c = cvWaitKey(27);
if(c!=-1)
break;
cvReleaseImage(&finalthreshold);
}
cvReleaseCapture(&capture);
return 0;
}
第1224行位于/usr/local/include/opencv2/core/types_c.h
CV_INLINE CvScalar cvScalar( double val0, double val1 CV_DEFAULT(0),
double val2 CV_DEFAULT(0), double val3 CV_DEFAULT(0))
您提到的结构在C中以您给定的名称存在。您可以继续使用它们,而不是使用C++ API来代替C++ API。 编辑:请注意,C实现没有默认参数。您需要为每个函数提供所有参数,即使只是将默认参数粘贴到中
有关更多信息,请参阅。这看起来像是C。您在编译它时遇到问题了吗?@juanchopanza我将错误添加到我的问题中,因为cvNamedWindow,似乎缺少
int标志。但是CVS呢?看起来我说的对吗?同样适用于,cvInRangeS(srcHSV,CvScalar(7107219),CvScalar(11148255),Thresholdimg);似乎没有什么问题?@Xentius你能在你的问题中添加/usr/local/include/opencv2/core/types_c.h
第1224行的声明/定义吗?@Xentius是第1224行还是第1242行?我很抱歉:/我想我已经睡了很长时间了。
CV_INLINE CvScalar cvScalar( double val0, double val1 CV_DEFAULT(0),
double val2 CV_DEFAULT(0), double val3 CV_DEFAULT(0))