使用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);