您的位置:首页 > 运维架构

基本opencv2处理方法(二)

2016-07-19 19:36 225 查看
使用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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: