1

我正在尝试使用 cvDiv 和 OpenCV 的 C API 将 2 除以 Ipl 图像的所有矩阵元素。我的代码如下:

IplImage* src = cvLoadImage(argv[1]);

CvMat*  src1 = cvCreateMat(src->height, src->width, CV_16UC3);

cvDiv(src, src1, double scale=2);

但是,我收到以下错误:

  error: expected primary-expression before ‘double’

谁能告诉我为什么?或者有没有其他方法可以将矩阵的所有元素除以一个特定的数字,比如 2?

4

1 回答 1

5

你可以这样做。但正如我所说,在 C-api 中执行此操作非常困难和冗长,但这是可能的。在 openCV C-Api 中,图像的矩阵属于同一类型非常重要。因此,您将无法使用您的

CvMat*  src1 = cvCreateMat(src->height, src->width, CV_16UC3);

但是像这样尝试,这在我的机器上就像一个魅力。

IplImage* src = cvLoadImage(argv[1]);
/*This ensures you'll end up with an image of the same type as the source image.
 *and it also will allocate the memory for you this must be done ahead.*/
IplImage* dest = cvCreateImage(
        cvSize(src->width, src->height),
        src->depth,
        src->nChannels
        );

/*we use this for the division*/
IplImage* div= cvCreateImage(
        cvSize(src->width, src->height),
        src->depth,
        src->nChannels
        );
/*this sets every scalar to 2*/
cvSet( div, cvScalar(2,2,2), NULL);
cvDiv( src, div, dest, 1 );

以上将使用 C-api 完成工作,同样可以使用 C++-api 使用以下代码实现,这是我向任何从 opencv 开始的人推荐的,因为我觉得 C-api 更加冗长,和困难。C++ 矩阵构造器和运算符重载使这项任务几乎是微不足道的:

cv::Mat Src2 = cv::imread( argv[1] );
cv::Mat Dest2 = Src2 / 2;
于 2013-08-01T11:09:19.503 回答