在OpenCV中用标量划分Ipl图像

时间:2013-08-01 09:48:24

标签: c opencv image-processing

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

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?

1 个答案:

答案 0 :(得分: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;