九州工业大学吧 关注:111贴子:555
  • 9回复贴,共1

图像处理opencv篇幅

只看楼主收藏回复

摄像头的读取


IP属地:山东1楼2018-05-18 14:37回复
    /*VideoCapture cap(0);
    if (!cap.isOpened())
    {
    return -1;
    }
    Mat frame;
    Mat edges;
    bool stop = false;
    while (!stop)
    {
    cap >> frame;
    cvtColor(frame, edges, CV_BGR2GRAY);
    GaussianBlur(edges, edges, Size(7, 7), 1.5, 1.5);
    Canny(edges, edges, 0, 30, 3);
    imshow("now", edges);
    if (waitKey(30) >= 0)
    stop = true;
    }
    return 0;*/


    IP属地:山东2楼2018-05-18 14:38
    回复
      读取图像文件
      /*
      #include <stdio.h>
      #include <opencv2/core/core.hpp>
      #include <opencv2/highgui/highgui.hpp>
      int main(void)
      {
      // 画像を格納するオブジェクトを宣言する
      cv::Matimage;
      // 画像ファイルから画像データを読み込む
      image = cv::imread("C:/Users/Ro/Desktop/24.jpg");
      // 表示するウィンドウを準備する(省略可)
      // ウィンドウにつける名前は自由
      cv::namedWindow("画像");
      // ウィンドウに画像を表示する
      cv::imshow("画像", image);
      // 何かキーが押されるまで待つ
      cv::waitKey();
      return 0;
      }
      */


      IP属地:山东5楼2018-05-18 14:41
      回复
        关于鱼的视频文件读取以及放大缩小
        int main(int argc, char *argv[])
        {
        CvCapture* capture = cvCaptureFromAVI("C:\\Users\\Ro\\Desktop\\IMG_9156.avi");//魚の動画を書き込み
        IplImage* frame = 0;
        int isColor = 1;
        int fps = 25; // or 25 //書き込みの書き直し
        CvVideoWriter *writer = cvCreateVideoWriter("C:\\Users\\Ro\\Desktop\\IMG_9156xg.avi", CV_FOURCC('X', 'V', 'I', 'D'), fps, cvSize(640, 480), isColor);
        cvNamedWindow("NewVideo");
        while (1)
        {
        frame = cvQueryFrame(capture); //一フレームの画像をゲットする
        if (frame == NULL)
        break;
        CvSize dstSize = cvSize(frame->width /2, frame->height /2);//ここで、ポイントだ(笑)
        IplImage *dst = cvCreateImage(dstSize, frame->depth, frame->nChannels);
        cvResize(frame, dst, CV_INTER_LINEAR);
        cvShowImage("NewVideo", dst); //ここで、新しい魚の動画をみせ
        char key = cvWaitKey(10);
        cvWriteFrame(writer, dst);
        frame = NULL;
        cvReleaseImage(&dst);
        }
        cvReleaseVideoWriter(&writer);
        cvDestroyWindow("NewVideo");
        return 0;
        }*/


        IP属地:山东6楼2018-05-18 14:41
        回复
          可从摄像头输入视频流或直接播放视频文件
          /*
          #include <stdio.h>
          #include <string>
          #include <opencv2/opencv.hpp>
          #include <opencv2/core/core.hpp>
          #include <opencv2/highgui/highgui.hpp>
          #include <opencv2/imgproc/imgproc.hpp>
          using namespace cv;
          using namespace std;
          void main()
          {
          cv::Mat frame;
          // 可从摄像头输入视频流或直接播放视频文件
          //cv::VideoCapture capture(0);
          cv::VideoCapture capture("IMG_9156.avi");
          double fps;
          char string[10]; // 用于存放帧率的字符串
          cv::namedWindow("Camera FPS");
          double t = 0;
          while (1)
          {
          t = (double)cv::getTickCount();
          if (cv::waitKey(50) == 30) { break; }
          if (capture.isOpened())
          {
          capture >> frame;
          // getTickcount函数:返回从操作系统启动到当前所经过的毫秒数
          // getTickFrequency函数:返回每秒的计时周期数
          // t为该处代码执行所耗的时间,单位为秒,fps为其倒数
          t = ((double)cv::getTickCount() - t) / cv::getTickFrequency();
          fps = 1.0 / t;
          sprintf(string, "%.2f", fps);
          std::string fpsString("FPS:");
          fpsString += string; //
          putText(frame, //
          fpsString, // string
          cv::Point(5, 20), // 文
          cv::FONT_HERSHEY_SIMPLEX, // 字体类型
          0.5, // 字体大小
          cv::Scalar(0, 0, 0)); // 字体颜色
          cv::imshow("Camera FPS", frame);
          }
          else
          {
          std::cout << "No Camera Input!" << std::endl;
          break;
          }
          }
          }
          ;*/


          IP属地:山东8楼2018-05-18 14:43
          回复
            canny 算法检测 copy
            #include "core/core.hpp"
            #include "highgui/highgui.hpp"
            #include "imgproc/imgproc.hpp"
            #include "iostream"
            #include "math.h"
            using namespace std;
            using namespace cv;
            //******************灰度转换函数*************************
            //第一个参数image输入的彩色RGB图像;
            //第二个参数imageGray是转换后输出的灰度图像;
            //*************************************************************
            void ConvertRGB2GRAY(const Mat &image,Mat &imageGray);
            //******************高斯卷积核生成函数*************************
            //第一个参数gaus是一个指向含有N个double类型数组的指针;
            //第二个参数size是高斯卷积核的尺寸大小;
            //第三个参数sigma是卷积核的标准差
            //*************************************************************
            void GetGaussianKernel(double **gaus, const int size,const double sigma);
            //******************高斯滤波*************************
            //第一个参数imageSource是待滤波原始图像;
            //第二个参数imageGaussian是滤波后输出图像;
            //第三个参数gaus是一个指向含有N个double类型数组的指针;
            //第四个参数size是滤波核的尺寸
            //*************************************************************
            void GaussianFilter(const Mat imageSource,Mat &imageGaussian,double **gaus,int size);
            //******************Sobel算子计算梯度和方向********************
            //第一个参数imageSourc原始灰度图像;
            //第二个参数imageSobelX是X方向梯度图像;
            //第三个参数imageSobelY是Y方向梯度图像;
            //第四个参数pointDrection是梯度方向数组指针
            //*************************************************************
            void SobelGradDirction(const Mat imageSource,Mat &imageSobelX,Mat &imageSobelY,double *&pointDrection);
            //******************计算Sobel的X和Y方向梯度幅值*************************
            //第一个参数imageGradX是X方向梯度图像;
            //第二个参数imageGradY是Y方向梯度图像;
            //第三个参数SobelAmpXY是输出的X、Y方向梯度图像幅值
            //*************************************************************
            void SobelAmplitude(const Mat imageGradX,const Mat imageGradY,Mat &SobelAmpXY);
            //******************局部极大值抑制*************************
            //第一个参数imageInput输入的Sobel梯度图像;
            //第二个参数imageOutPut是输出的局部极大值抑制图像;
            //第三个参数pointDrection是图像上每个点的梯度方向数组指针
            //*************************************************************
            void LocalMaxValue(const Mat imageInput,Mat &imageOutput,double *pointDrection);
            //******************双阈值处理*************************
            //第一个参数imageInput输入和输出的的Sobel梯度幅值图像;
            //第二个参数lowThreshold是低阈值
            //第三个参数highThreshold是高阈值
            //******************************************************
            void DoubleThreshold(Mat &imageIput,double lowThreshold,double highThreshold);
            //******************双阈值中间像素连接处理*********************
            //第一个参数imageInput输入和输出的的Sobel梯度幅值图像;
            //第二个参数lowThreshold是低阈值
            //第三个参数highThreshold是高阈值
            //*************************************************************


            IP属地:山东9楼2018-05-18 14:45
            回复
              void DoubleThresholdLink(Mat &imageInput,double lowThreshold,double highThreshold);
              Mat imageSource;
              Mat imageGray;
              Mat imageGaussian;
              int main(int argc,char *argv[])
              {
              imageSource=imread(argv[1]); //读入RGB图像
              imshow("RGB Image",imageSource);
              ConvertRGB2GRAY(imageSource,imageGray); //RGB转换为灰度图
              imshow("Gray Image",imageGray);
              int size=5; //定义卷积核大小
              double **gaus=new double *[size]; //卷积核数组
              for(int i=0;i<size;i++)
              {
              gaus[i]=new double[size]; //动态生成矩阵
              }
              GetGaussianKernel(gaus,5,1); //生成5*5 大小高斯卷积核,Sigma=1;
              imageGaussian=Mat::zeros(imageGray.size(),CV_8UC1);
              GaussianFilter(imageGray,imageGaussian,gaus,5); //高斯滤波
              imshow("Gaussian Image",imageGaussian);
              Mat imageSobelY;
              Mat imageSobelX;
              double *pointDirection=new double[(imageSobelX.cols-1)*(imageSobelX.rows-1)]; //定义梯度方向角数组
              SobelGradDirction(imageGaussian,imageSobelX,imageSobelY,pointDirection); //计算X、Y方向梯度和方向角
              imshow("Sobel Y",imageSobelY);
              imshow("Sobel X",imageSobelX);
              Mat SobelGradAmpl;
              SobelAmplitude(imageSobelX,imageSobelY,SobelGradAmpl); //计算X、Y方向梯度融合幅值
              imshow("Soble XYRange",SobelGradAmpl);
              Mat imageLocalMax;
              LocalMaxValue(SobelGradAmpl,imageLocalMax,pointDirection); //局部非极大值抑制
              imshow("Non-Maximum Image",imageLocalMax);
              Mat cannyImage;
              cannyImage=Mat::zeros(imageLocalMax.size(),CV_8UC1);
              DoubleThreshold(imageLocalMax,90,160); //双阈值处理
              imshow("Double Threshold Image",imageLocalMax);
              DoubleThresholdLink(imageLocalMax,90,160); //双阈值中间阈值滤除及连接
              imshow("Canny Image",imageLocalMax);
              waitKey();
              system("pause");
              return 0;
              }
              //******************高斯卷积核生成函数*************************
              //第一个参数gaus是一个指向含有N个double类型数组的指针;
              //第二个参数size是高斯卷积核的尺寸大小;
              //第三个参数sigma是卷积核的标准差
              //*************************************************************
              void GetGaussianKernel(double **gaus, const int size,const double sigma)
              {
              const double PI=4.0*atan(1.0); //圆周率π赋值
              int center=size/2;
              double sum=0;
              for(int i=0;i<size;i++)
              {
              for(int j=0;j<size;j++)
              {
              gaus[i][j]=(1/(2*PI*sigma*sigma))*exp(-((i-center)*(i-center)+(j-center)*(j-center))/(2*sigma*sigma));
              sum+=gaus[i][j];
              }
              }
              for(int i=0;i<size;i++)
              {
              for(int j=0;j<size;j++)
              {
              gaus[i][j]/=sum;
              cout<<gaus[i][j]<<" ";
              }
              cout<<endl<<endl;
              }
              return ;
              }
              //******************灰度转换函数*************************
              //第一个参数image输入的彩色RGB图像;
              //第二个参数imageGray是转换后输出的灰度图像;
              //*************************************************************
              void ConvertRGB2GRAY(const Mat &image,Mat &imageGray)
              {
              if(!image.data||image.channels()!=3)
              {
              return ;
              }
              imageGray=Mat::zeros(image.size(),CV_8UC1);
              uchar *pointImage=image.data;
              uchar *pointImageGray=imageGray.data;
              int stepImage=image.step;
              int stepImageGray=imageGray.step;
              for(int i=0;i<imageGray.rows;i++)
              {
              for(int j=0;j<imageGray.cols;j++)
              {
              pointImageGray[i*stepImageGray+j]=0.114*pointImage[i*stepImage+3*j]+0.587*pointImage[i*stepImage+3*j+1]+0.299*pointImage[i*stepImage+3*j+2];
              }
              }
              }
              //******************高斯滤波*************************
              //第一个参数imageSource是待滤波原始图像;
              //第二个参数imageGaussian是滤波后输出图像;
              //第三个参数gaus是一个指向含有N个double类型数组的指针;
              //第四个参数size是滤波核的尺寸
              //*************************************************************
              void GaussianFilter(const Mat imageSource,Mat &imageGaussian,double **gaus,int size)
              {
              imageGaussian=Mat::zeros(imageSource.size(),CV_8UC1);
              if(!imageSource.data||imageSource.channels()!=1)
              {
              return ;
              }
              double gausArray[100];
              for(int i=0;i<size*size;i++)
              {
              gausArray[i]=0; //赋初值,空间分配
              }
              int array=0;
              for(int i=0;i<size;i++)
              {
              for(int j=0;j<size;j++)
              {
              gausArray[array]=gaus[i][j];//二维数组到一维 方便计算
              array++;
              }
              }
              //滤波
              for(int i=0;i<imageSource.rows;i++)
              {
              for(int j=0;j<imageSource.cols;j++)
              {
              int k=0;
              for(int l=-size/2;l<=size/2;l++)
              {
              for(int g=-size/2;g<=size/2;g++)
              {
              //以下处理针对滤波后图像边界处理,为超出边界的值赋值为边界值
              int row=i+l;
              int col=j+g;
              row=row<0?0:row;
              row=row>=imageSource.rows?imageSource.rows-1:row;
              col=col<0?0:col;
              col=col>=imageSource.cols?imageSource.cols-1:col;
              //卷积和
              imageGaussian.at<uchar>(i,j)+=gausArray[k]*imageSource.at<uchar>(row,col);
              k++;
              }
              }
              }
              }
              }


              IP属地:山东10楼2018-05-18 14:46
              回复
                大神还在读吗,想考今年的大学院,求指教


                13楼2020-01-15 01:47
                回复
                  大佬是哪个研究室的啊,我在九州工业大学也有个视觉的教授要我,在考虑去不去


                  14楼2021-11-19 08:04
                  回复
                    我那个教授是图像处理研究室,在机械知能里,是个越南女教授,看上去很耐心的样子


                    15楼2021-11-19 08:07
                    回复