基本opencv2处理方法(二)

使用filter2D进行邻域计算:

void shape2D(const Mat& image,Mat& result)
{
    Mat kernel(3,3,CV_32FC1,Scalar(0));//3*3 1通道向量
    kernel.at<float>(1,1) = 5.0;
    kernel.at<float>(0,1) = -1.0;
    kernel.at<float>(1,0) = -1.0;
    kernel.at<float>(1,2) = -1.0;
    kernel.at<float>(2,1) = -1.0;
    filter2D(image,result,image.depth(),kernel);
}

//main函数调用
{
    Mat imageFilter = imread("1.jpg",1);
    Mat filterResult;
    filterResult.create(imageFilter.size(),imageFilter.type());
    shape2D(imageFilter,filterResult);
    namedWindow("FilterResult");
    imshow("FilterResult",filterResult);
}

result.row(0).setTo(Scalar(0)); 可以将result矩阵的第0行所有像素全部设置为0。

算术操作:
opencv重载了很多操作符:
你可以直接对它们进行运算,比如:
float weight ;
Mat mat1,mat2,mat3;
mat3 = weight*mat1+mat2。
这都是支持的,可以直接运算。

定义感兴趣区域:

Mat image;
Mat imageROI = image(Rect(140,20,image.cols,image.rows));;

opencv2和opencv1矩阵类型之间的转换。
Mat matImage = imread(“1.jpg”,1);
IplImage image = matImage;
IplImage* ptr_image = &(IplImage)matImage;
ptr_image = &matImage.operator IplImage();
Mat mat(ptr_image,false/true);

画直方图:

//直方图的部分
int _tmain(int argc, _TCHAR* argv[])
{
    Mat image = imread("1.jpg",0); //0 表示取一通道,灰度图像 1表示彩色图像
    if (!image.data)
    {
        return 0; //error
    }

    MatND hist;
    int dims = 1;
    float hranges[] = {0,255};
    const float* ranges[] ={ hranges};//范围值 这里需要为const类型  
    int size = 256;
    int channels = 0;

    calcHist(&image,1,&channels,Mat(),hist,dims,&size,ranges);


    int scale = 1;
    Mat imageShow(size*scale,size,CV_8U,Scalar(0));
    //获得最大值和最小值
    double minVal = 0;
    double maxVal = 0;

    minMaxLoc(hist,&minVal,&maxVal,0,0);
    int hpt = saturate_cast<int>(0.9*size);
    for (int i=0;i<256;i++)
    {
        float value = hist.at<float>(i);
        int realValue = saturate_cast<int>(value*hpt/maxVal);
        rectangle(imageShow,Point(i*scale,size-1),Point((i+1)*scale-1,size - realValue),Scalar(255));
    }
    namedWindow("showImage");
    imshow("showImage",imageShow);

你可能感兴趣的:(计算机视觉与机器学习)