我使用的是旧版本的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");
}
答案 0 :(得分:1)
首先,在使用像“Learining OpenCV”这样过时的书时,不要害怕使用C++ API
,因为这些概念仍然相关。如果您理解这个想法,那么转换为C++ API
并不难,而且这是一个很好的练习,因为您不能只复制粘贴代码。我用这种方式学习了OpenCV,我认为它有效:)。
使用C ++ API,它就像
一样简单cv::Mat zeros = cv::Mat::zeros(Iat.size());
cv::Mat blackPixels = (Iat == zeros);
int blackPixelsCount = blackPixels.total();
答案 1 :(得分:0)
行中的问题
blackpixel = Iat->width(i);
是错误的语法。
Iat-&gt; 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,那么这应该更快。