0

我正在使用旧版本的C,因为我使用的书已经过时了:(目前,我正在做一个项目来检测图像中的对象。首先我对灰度图像进行高斯平滑,然后腐蚀它。 ,我应用阈值。现在我正在尝试获取每个宽度有多少黑色像素,以便我可以将它与其他行进行比较以确定中心。我正在“for”循环中尝试这个,但是,我不断得到错误:

术语不计算为带 1 个参数的函数

#include <highgui.h>
#include <cv.h>
#include <cxcore.h>

int main()
{
    int total,  
        zero,
        width,
        blackpixel;

    IplImage* in = cvLoadImage("Wallet.jpg", CV_LOAD_IMAGE_GRAYSCALE);
    IplImage* gsmooth = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 1);
    IplImage* erode = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 1);
    IplImage* Iat = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 1);
    IplImage* bpixel = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 1);

    cvSmooth(in, gsmooth, CV_GAUSSIAN, 3, 0, 0, 0);
    cvErode(gsmooth, erode, NULL, 2);
    cvThreshold(erode, Iat, 100, 255, CV_THRESH_BINARY);

    total = (Iat->height)*(Iat->width);

    zero = total - cvCountNonZero(Iat);

    printf("Total pixels: %d\nWhite pixels: %d\nBlack pixels: %d\n", total, cvCountNonZero(Iat), zero);

    for(int i = 0; i < Iat->width; i++)
    {
        blackpixel = Iat->width(i);
    }

    cvNamedWindow("Original", 1);
    cvNamedWindow("Gaussian Smoothing", 1);
    cvNamedWindow("Erode", 1);
    cvNamedWindow("Adaptive Threshold", 1);

    cvShowImage("Original", in);
    cvShowImage("Gaussian Smoothing", gsmooth);
    cvShowImage("Erode", erode);
    cvShowImage("Adaptive Threshold", Iat);

    cvWaitKey(0);

    cvReleaseImage(&in);
    cvReleaseImage(&gsmooth);
    cvReleaseImage(&erode);
    cvReleaseImage(&Iat);

    cvDestroyWindow("Original");
    cvDestroyWindow("Gaussian Smoothing");
    cvDestroyWindow("Erode");
    cvDestroyWindow("Adaptive Threshold");
}
4

2 回答 2

1

C++ API首先,在使用像《学习 OpenCV》这样过时的书时不要害怕使用,因为这些概念仍然是相关的。如果您理解这个想法,翻译到C++ API并不难,而且是一个很好的练习,因为您不能只是复制粘贴代码。我以这种方式学习了 OpenCV,我认为它有效:)。

使用 C++ API,它就像

cv::Mat zeros = cv::Mat::zeros(Iat.size());
cv::Mat blackPixels = (Iat == zeros);
int blackPixelsCount = blackPixels.total();
于 2013-07-10T15:12:13.283 回答
0

线的问题

blackpixel = Iat->width(i);

是错误的语法。

Iat->width 会给你图像的宽度,一个整数属性。

我不认为循环

for(int i = 0; i < Iat->height; i++) 
    {
        blackpixel = Iat->width(i);
    }

可以计算给定行中黑色像素的数量。你可能需要类似的东西

for(int i = 0; i < Iat->height; i++) // // every row
{
    for(int j = 0; j < Iat->width; j++) // pixels in each row
    {
       // get count pixels here
    }
    // do things with the count for the current row
}

如果您使用的是 cvMat 数据结构而不是 IplImage,这应该会更快。

于 2013-07-10T07:05:32.037 回答