【OpenCV归纳】3 在实例中学习简单函数以及数据读写



实例一int main(){IplImage* img = cvLoadImage("6085.jpg", 1);

IplImage* red = cvCreateImage(cvGetSize(img), img->depth, 1);IplImage* green = cvCreateImage(cvGetSize(img), img->depth, 1);IplImage* blue = cvCreateImage(cvGetSize(img), img->depth, 1);

cvSplit(img, blue, green, red, NULL);

IplImage* img1 = cvCloneImage(green);IplImage* img2 = cvCloneImage(green);

double dMaxValue, dMinValue;cvMinMaxLoc(green, &dMinValue, &dMaxValue, NULL, NULL, NULL);printf("Max: %f\tMin: %f\n", dMaxValue, dMinValue);

unsigned char thresh = (dMaxValue – dMinValue) / 2;cvSet(img1, cvScalarAll(thresh), 0);cvSet(img2, cvScalarAll(0), 0);

cvCmp(green, img1, img2, CV_CMP_GE);cvSubS(green, cvScalarAll(thresh/2), green, img2);

cvShowImage("Clone1", img1);cvShowImage("Clone2", img2);

cvShowImage("Red", red);cvShowImage("Green", green);cvShowImage("Blue", blue);

cvWaitKey(0);return 0;}cvSplit()函数可以分别复制每个通道到多个单通道图像,,当然,cvSplit()函数还可以复制src的各个通道到图像dst0,dst1,dst2和dst3中。注意,目标tuxiang必须和源图像在大小和数据类型上均匹配,当然,也应该是单通道的图像。如果源图像少于4个通道,这样的话传递给cvSplit()的不必要的目标参数可以设置成NULL。void cvSplit(const CvArr* src, CvArr* dst0, CvArr* dst1, CvArr* dst2, CvArr* dst3);

cvSet()函数能将数组的所有通道的所有值设置为指定的参数value。该cvSet()函数接受一个可选的参数,如果提供参数,那么只有那些参数mask中非0值对应的像素将被设置为指定的值。另外有cvSetZero()函数,相当于cvSet(0,0)。void cvSet(CvArr* arr, CvScalar* value, const CvArr* mask = NULL);

void cvMinMaxLoc(const CvArr* arr, double* min_val, double* max_val, CvPoint* min_loc = NULL, CvPoint* max_loc = NULL, const CvArr* mask = NULL);该函数用于找出数组中的最大值和最小值,并且还可以返回它们的地址。计算出的最大值和最小值赋值给max_val和min_val。如果极值的位置参数非空,那极值的位置便会写入min_loc和max_loc。如果参数mask非空,那么只有arr中与参数mask中的非零的像素相对应的部分才被考虑。cvMinMaxLoc()仅仅处理单通道数组,如果有一个多通道的数组,则应该使用cvSetCOI()来对某个特定通道进行设置。cvSetCOI()函数在下文有相关介绍。cvCmp和cvCmpS两个函数都是进行对比操作,比较两幅图像对应的像素值或将给定图像的像素值与某常标量值进行比较。cvCmp()和cvCmpS()的最后一个参数和比较操作符可以是以下的任意一个。CV_CMP_EQ (src1i == src2i)CV_CMP_GT (src1i > src2i)CV_CMP_GE (src1i >= src2i)CV_CMP_LT (src1i < src2i)CV_CMP_LE (src1i <= src2i)CV_CMP_NE (src1i != src2i)

实例二

int main(){IplImage* img = cvLoadImage("6085.jpg");int x = 400, y = 400;int width = 150, height = 150;

int add =180;cvSetImageROI(img, cvRect(x, y, width, height));

cvAddS(img, cvScalar(add), img);cvResetImageROI(img);cvShowImage("Image", img);cvWaitKey(0);return 0;}

void cvAddS(const CvArr* src, CvScalar value, CvArr* dst, const CvArr* mask = NULL);void cvAdd(const CvArr* src1, const CvArr* src2,CvArr* dst, const CvArr* mask = NULL);这两个函数都都比较简单在此不再介绍,下面我们来看看cvAddWeighted()函数。void cvAddWeighted(const CvArr* src1, double alpha, const CvArr* src2, double beta, double gamma, CvArr* dst);在这里包含着一个计算公式:dst(x,y)=alpha*src1(x,y)+beta*src2(x,y)+gamma结果图像dst和src1、src2必须是同样的像素类型,也些图像的尺寸不要求相同,但ROI必须统一尺寸。

cvSetImageROIvoid cvSetImageROI(IplImage* image, CvRect rect);void cvResetImageROI(IplImage* image);通过cvResetImageROI()函数释放ROI是非常重要的,否则,最终只会显示你所设置的感兴趣的部分,而不是整个图像。

实例三

int main(){IplImage* src = cvLoadImage("8479.jpg",1);

天才是百分之一的灵感加上百分之九十九的努力

【OpenCV归纳】3 在实例中学习简单函数以及数据读写

相关文章:

你感兴趣的文章:

标签云: