如何使用 CV_CAP_PROP_FOURCC?
Posted
技术标签:
【中文标题】如何使用 CV_CAP_PROP_FOURCC?【英文标题】:how to use CV_CAP_PROP_FOURCC? 【发布时间】:2014-03-14 00:30:56 【问题描述】:这看起来很简单,但我无法让它工作。我想使用
打印出图像的格式cvGetCaptureProperty(image, CV_CAP_PROP_FOURCC)
其中image
是 CvCapture 结构的对象。
此函数返回double
。我确实将它转换为 char* 以便我可以打印出格式,但它不起作用。有什么建议吗?
【问题讨论】:
【参考方案1】:获取double*
并将其转换:
double f = cvGetCaptureProperty(image, CV_CAP_PROP_FOURCC);
char* fourcc = (char*) (&f); // reinterpret_cast
但是,this OpenCV highgui tutorial 建议使用 C++ 接口进行以下操作:
int ex = static_cast<int>(inputVideo.get(CV_CAP_PROP_FOURCC));
// Transform from int to char via Bitwise operators
char EXT[] = (char)(ex & 0XFF),(char)((ex & 0XFF00) >> 8),(char)((ex & 0XFF0000) >> 16),(char)((ex & 0XFF000000) >> 24),0;
当然,您可以使用cvGetCaptureProperty
,而不是get
方法。
【讨论】:
我这样做了,但我什么也没得到。double f = cvGetCaptureProperty(image, CV_CAP_PROP_FOURCC); char* fourcc = (char*)(&f); std::cout << "\nFormat : " << fourcc[0] << fourcc[1] << std::endl;
我什么都没有。
@CroCo 呵呵,你可以按照 highgui 教程的例子(见更新),将 double 转换为 int,然后通过一系列按位运算转换为 char。
@CroCo 您也可以尝试cout << "format: " << EXT << endl;
使用由所有按位操作创建的空终止版本。
但为什么我需要按位使用?有没有一种简单的方法可以做到这一点?此外,我尝试在 openCV 的文档中使用该方法,但是如果我访问 EXT[5]
,它会为我提供数据。为什么会发生这种情况?不是只有四个字符吗?
@CroCo A C 字符串为null-terminated,表示最后一个字节为'\0'
。不要直接访问它,因为它只是表示“字符串”的结束。 (忽略它,因为它只是用于cout
knows when to stop。)【参考方案2】:
您可以使用以下功能:
// http://mkonrad.net/2014/06/24/cvvideocamera-vs-native-ios-camera-apis.html
void fourCCStringFromCode(int code, char fourCC[5])
for (int i = 0; i < 4; i++)
fourCC[3 - i] = code >> (i * 8);
fourCC[4] = '\0';
例如:
double f = cvGetCaptureProperty(capture, CV_CAP_PROP_FOURCC);
printf("fourcc=%d\n", f); // outputs fourcc=6
char fourcc[5];
fourCCStringFromCode((int)f, fourcc);
printf("fourcc=%s\n", fourcc); // outputs fourcc=DIVX
【讨论】:
以上是关于如何使用 CV_CAP_PROP_FOURCC?的主要内容,如果未能解决你的问题,请参考以下文章
如何正确使用 % include % 标签在 django 中呈现模板(如部分)?