#include "stdafx.h"   
#include"cv.h"   
#include"highgui.h"   
#include"stdio.h"   
#include <iostream>
 using namespace std;
  
// 实现将拍下来的图片缩放一倍   
IplImage* DoPyrDown(IplImage* image, int filter = IPL_GAUSSIAN_5x5)  
{  
//assert(image->width%2==0 && image->height%2==0);
    // 设置大小缩小一倍   
    CvSize size = cvSize(image->width / 2,image->height / 2);  
    //初始化图片   
    IplImage* outImage = cvCreateImage(size,image->depth,image->nChannels);  
//IplImage* outImage1 = cvCreateImage(size,image->depth,image->nChannels);  
    //实现缩放   
    cvPyrDown(image,outImage);  
CvScalar s;
    int sum=0;
    for (int i=0;i<outImage->height;i++)
    {
        for (int j=0;j<outImage->width;j++)
        {
            s =  cvGet2D(outImage,i,j);
            //cout<<s.val[0]<<" "<<s.val[1]<<" "<<s.val[2]<<endl;
            sum = (s.val[0]+s.val[1]+s.val[2])/3;
            if (sum > 128)
            {
                s.val[0]=s.val[1]=s.val[2]=255;
                cvSet2D(outImage,i,j,s);
            }
            else
            {
                s.val[0]=s.val[1]=s.val[2]=0;
                cvSet2D(outImage,i,j,s);            }
        }
    }
//cvCvtColor(outImage,outImage1,CV_RGB2RGBA);
char* filename ="C:\\Documents and Settings\\abc\\My Documents\\light test\\Assets\\Standard Assets\\Light Cookies\\test.jpg";
cvSaveImage(filename,outImage);

    cvReleaseImage(&outImage);  
return outImage;
}    
int main(int argc, char** argv)  
{  
    cvNamedWindow("vedio");  
    CvCapture* capture;  
     // 首先是要通过摄像设备来得到一个CvCapture对象   
    if(1 == argc)  
    {  
        capture = cvCreateCameraCapture(0);  
    }  
    else  
    {  
        capture = cvCreateCameraCapture(atoi(argv[1]));  
    }  
  
    assert(NULL != capture);  
  
    IplImage* frame;  
IplImage* img;
    char keyCode;  
    // 每隔30ms捕捉一次视频图像   
    // 可以设为while(1)  使得实时捕捉视频画面   
    while((keyCode = cvWaitKey(100)))  
    {  
        //表示按下了ESC键,退出   
        if(keyCode == 27)  
        {  
            break;  
        }  
  
        // 得到摄像设备的下一帧图像   
        frame = cvQueryFrame(capture);  
        if(!frame)  
        {  
            break;  
        }  
IplImage* outImage1 = cvCreateImage(cvGetSize(frame),frame->depth,frame->nChannels);  
  //     //     // 将原图拷贝过来   
        cvCopy(frame,outImage1,NULL); 
cvShowImage("vedio",frame);
img = DoPyrDown(outImage1);

cvReleaseImage(&outImage1);
          

    }      cvReleaseImage(&frame);  
    cvDestroyAllWindows();  
    return 0;  
}  
为什么下面改成width / 4,image->height / 4 就会出错呢!!  改成width / 2,image->height / 2就没有问题  这是为什么????? 想要再缩小该怎么改???    CvSize size = cvSize(image->width / 4,image->height / 4);  
    //初始化图片   
    IplImage* outImage = cvCreateImage(size,image->depth,image->nChannels);  
    //实现缩放   
    cvPyrDown(image,outImage);  
OpenCV图片

解决方案 »

  1.   


    #include "stdafx.h"   
    #include"cv.h"   
    #include"highgui.h"   
    #include"stdio.h"   
    #include <iostream>
     using namespace std;
      
    // 实现将拍下来的图片缩放一倍   
    IplImage* DoPyrDown(IplImage* image, int filter = IPL_GAUSSIAN_5x5)  
    {  
    //assert(image->width%2==0 && image->height%2==0);
        // 设置大小缩小一倍   
        CvSize size = cvSize(image->width / 2,image->height / 2);  
        //初始化图片   
        IplImage* outImage = cvCreateImage(size,image->depth,image->nChannels);  
    //IplImage* outImage1 = cvCreateImage(size,image->depth,image->nChannels);  
        //实现缩放   
        cvPyrDown(image,outImage);  
    CvScalar s;
        int sum=0;
        for (int i=0;i<outImage->height;i++)
        {
            for (int j=0;j<outImage->width;j++)
            {
                s =  cvGet2D(outImage,i,j);
                //cout<<s.val[0]<<" "<<s.val[1]<<" "<<s.val[2]<<endl;
                sum = (s.val[0]+s.val[1]+s.val[2])/3;
                if (sum > 128)
                {
                    s.val[0]=s.val[1]=s.val[2]=255;
                    cvSet2D(outImage,i,j,s);
                }
                else
                {
                    s.val[0]=s.val[1]=s.val[2]=0;
                    cvSet2D(outImage,i,j,s);            }
            }
        }
    //cvCvtColor(outImage,outImage1,CV_RGB2RGBA);

    return outImage;
    }    
    int main(int argc, char** argv)  
    {  
        cvNamedWindow("vedio");  
        CvCapture* capture;  
         // 首先是要通过摄像设备来得到一个CvCapture对象   
        if(1 == argc)  
        {  
            capture = cvCreateCameraCapture(0);  
        }  
        else  
        {  
            capture = cvCreateCameraCapture(atoi(argv[1]));  
        }  
      
        assert(NULL != capture);  
      
        IplImage* frame;  
    IplImage* img;
        char keyCode;  
        // 每隔30ms捕捉一次视频图像   
        // 可以设为while(1)  使得实时捕捉视频画面   
        while((keyCode = cvWaitKey(100)))  
        {  
            //表示按下了ESC键,退出   
            if(keyCode == 27)  
            {  
                break;  
            }  
      
            // 得到摄像设备的下一帧图像   
            frame = cvQueryFrame(capture);  
            if(!frame)  
            {  
                break;  
            }  
    IplImage* outImage1 = cvCreateImage(cvGetSize(frame),frame->depth,frame->nChannels);  
      //     //     // 将原图拷贝过来   
            cvCopy(frame,outImage1,NULL); 
    cvShowImage("vedio",frame);
    img = DoPyrDown(outImage1);
    img = DoPyrDown(img);
    img = DoPyrDown(img);
    img = DoPyrDown(img);
    img = DoPyrDown(img);
    char* filename ="C:\\Documents and Settings\\abc\\My Documents\\light test\\Assets\\Standard Assets\\Light Cookies\\test.jpg";
    cvSaveImage(filename,img);
    cvReleaseImage(&img);  
    cvReleaseImage(&outImage1);
              

        }      cvReleaseImage(&frame);  
        cvDestroyAllWindows();  
        return 0;  
    }