《学习OpenCV 中文版》的课后习题,我做的答案中的一部分,vc6.0下编译通过。
Chapter3.3
题目要求我们先定义一个数组,再使用函数cvPtr2D()将指针指向中间的通道(“绿色”),以给定的两个点画一个绿色的长方形。
网上参考的代码很多都是用cvRectangle做的,我觉得题目本意是要求用指针做,随手写的代码如下:
#include <cv.h> #include <highgui.h> int main() { IplImage *img; img = cvCreateImage(cvSize(200,200),IPL_DEPTH_8U,3); cvZero(img); uchar* pData = cvPtr2D(img,20,5,NULL);//从左上开始,先画水平线 pData ++; for(int i =5;i<=20;i++) { *pData = 255; pData ++; pData ++; pData ++; } pData = cvPtr2D(img,40,5,NULL); pData ++; for( i =5;i<=20;i++) { *pData = 255; pData ++; pData ++; pData ++; } pData = cvPtr2D(img,20,5,NULL);//从左上开始,再画垂直线 pData ++; for( i =20;i<=40;i++) { *pData = 255; pData += img->widthStep; } pData = cvPtr2D(img,20,20,NULL); pData ++; for( i =20;i<=40;i++) { *pData = 255; pData += img->widthStep; } cvNamedWindow( "Source", CV_WINDOW_AUTOSIZE ); cvShowImage( "Source", img ); cvWaitKey(); return 0; }
/***********************************************************************************
********************************分***割***线*****************************************
***********************************************************************************/
3.4:用指针算法绘制一个绿色平面;
#include <cv.h> #include <highgui.h> int main() { IplImage *img; img = cvCreateImage(cvSize(200,200),IPL_DEPTH_8U,3); cvZero(img); uchar* pData = cvPtr2D(img,20,5,NULL);//从左上开始,先画水平线 for(int i =20;i<=40;i++) { for(int j = 5;j<=20;j++) { pData ++; *pData = 255; pData ++; pData ++; } pData = pData + img->widthStep - 16*3; //pData = cvPtr2D(img,i+1,5,NULL);//每次都要重新寻址,效率低些。 j=5; } cvNamedWindow( "Source", CV_WINDOW_AUTOSIZE ); cvShowImage( "Source", img ); cvWaitKey(); return 0; }
CvScalar本质上就是一个结构体 成员是一个有4个元素的double类型的数组,你喜欢用它干啥就干啥typedef struct CvScalar { double val[4] } CvScalar;
/***********************************************************************************
********************************分***割***线*****************************************
***********************************************************************************/
3.6:
#include <cv.h> #include <highgui.h> int main(int argc, char** argv) { IplImage *img; img = cvLoadImage("42.jpg"); IplImage *img1 = cvCreateImageHeader(cvSize(100,30),img->depth,img->nChannels); IplImage *img2 = cvCreateImageHeader(cvSize(50,200),img->depth,img->nChannels); img1->origin = img->origin; img2->origin = img->origin; img1->widthStep = img->widthStep;//非常重要,默认的初始值是300与原图不符 img2->widthStep = img->widthStep;//非常重要,默认的初始值是300与原图不符 img1->imageData = (char*)cvPtr2D(img,5,10); img2->imageData = (char*)cvPtr2D(img,50,60); cvNot(img1,img1); cvNot(img2,img2); cvNamedWindow( "Source", CV_WINDOW_AUTOSIZE ); cvShowImage( "Source", img ); cvWaitKey(); return 0; }