在OpenCV中用标量划分Ipl图像

use*_*666 1 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);
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误:

  error: expected primary-expression before ‘double’
Run Code Online (Sandbox Code Playgroud)

任何人都能说出原因吗?或者有没有其他方法将矩阵的所有元素除以特定数字2?

het*_*fan 5

你可以这样做.但正如我所说,在C-api中这样做是非常困难和冗长的,但这是可能的.在openCV C-Api中,图像的矩阵具有相同的类型非常重要.因此,你无法用你的

CvMat*  src1 = cvCreateMat(src->height, src->width, CV_16UC3);
Run Code Online (Sandbox Code Playgroud)

但尝试这样就像我的机器上的魅力.

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 );
Run Code Online (Sandbox Code Playgroud)

以上将使用C-api完成工作,使用C++ - api可以通过以下代码实现同样的功能,这是我建议任何以opencv开头的人,因为我觉得C-api更冗长,而且很难.C++矩阵构造函数和运算符重载使得任务几乎无足轻重:

cv::Mat Src2 = cv::imread( argv[1] );
cv::Mat Dest2 = Src2 / 2;
Run Code Online (Sandbox Code Playgroud)