cvConvertScale用法

cvConvertScale用法

ConvertScale
使用线性变换转换数组

void cvConvertScale( const CvArr* src, CvArr* dst, double scale=1, double shift=0 );
#define cvCvtScale cvConvertScale
#define cvScale cvConvertScale
#define cvConvert( src, dst ) cvConvertScale( (src), (dst), 1, 0 )
src
输入数组.
dst
输出数组
scale
比例因子.
shift
该加数被加到输入数组元素按比例缩放后得到的元素上
函数 cvConvertScale 有多个不同的目的因此就有多个同义函数(如上面的#define所示)。该函数首先对输入数组的元素进行比例缩放,然后将shift加到比例缩放后得到的各元素上,即: dst(I)=src(I)*scale + (shift,shift,...),最后可选的类型转换将结果拷贝到输出数组。

多通道的数组对各个通道是独立处理的。

类型转换主要用舍入和溢出截断来完成。也就是如果缩放+转换后的结果值不能用输出数组元素类型值精确表达,就设置成在输出数组数据轴上最接近该数的值。

如果 scale=1, shift=0 就不会进行比例缩放. 这是一个特殊的优化,相当于该函数的同义函数名:cvConvert 。如果原来数组和输出数组的类型相同,这是另一种特殊情形,可以被用于比例缩放和平移矩阵或图像,此时相当于该函数的同义函数名:cvScale。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是使用JavaCV提取图像指纹,使用直方图方法的示例代码: ```java import static org.bytedeco.opencv.global.opencv_core.CV_32FC1; import static org.bytedeco.opencv.global.opencv_core.CV_WHOLE_SEQ; import static org.bytedeco.opencv.global.opencv_core.addWeighted; import static org.bytedeco.opencv.global.opencv_core.cvConvertScale; import static org.bytedeco.opencv.global.opencv_core.cvCreateHist; import static org.bytedeco.opencv.global.opencv_core.cvCreateImage; import static org.bytedeco.opencv.global.opencv_core.cvGetSize; import static org.bytedeco.opencv.global.opencv_core.cvMinMaxLoc; import static org.bytedeco.opencv.global.opencv_core.cvNormalize; import static org.bytedeco.opencv.global.opencv_imgcodecs.CV_LOAD_IMAGE_GRAYSCALE; import static org.bytedeco.opencv.global.opencv_imgcodecs.imread; import static org.bytedeco.opencv.global.opencv_imgproc.CV_COMP_CHISQR; import static org.bytedeco.opencv.global.opencv_imgproc.CV_HIST_ARRAY; import static org.bytedeco.opencv.global.opencv_imgproc.CV_INTER_LINEAR; import static org.bytedeco.opencv.global.opencv_imgproc.cvCalcHist; import static org.bytedeco.opencv.global.opencv_imgproc.cvCompareHist; import static org.bytedeco.opencv.global.opencv_imgproc.cvEqualizeHist; import static org.bytedeco.opencv.global.opencv_imgproc.cvGetMinMaxHistValue; import static org.bytedeco.opencv.global.opencv_imgproc.cvResize; import static org.bytedeco.opencv.global.opencv_imgproc.cvSetHistBinRanges; import static org.bytedeco.opencv.global.opencv_imgproc.cvSetImageROI; import static org.bytedeco.opencv.global.opencv_imgproc.cvSplit; import org.bytedeco.javacpp.FloatPointer; import org.bytedeco.javacpp.Pointer; import org.bytedeco.opencv.opencv_core.CvArr; import org.bytedeco.opencv.opencv_core.CvHistogram; import org.bytedeco.opencv.opencv_core.CvMat; import org.bytedeco.opencv.opencv_core.CvSize; import org.bytedeco.opencv.opencv_core.IplImage; public class ImageFingerprint { // 提取图像指纹 public static float[] extract(IplImage image) { // 将图像转换为灰度图像 IplImage grayImage = cvCreateImage(cvGetSize(image), image.depth(), 1); cvCvtColor(image, grayImage, CV_INTER_LINEAR); // 直方图均衡化 cvEqualizeHist(grayImage, grayImage); // 分离图像通道 IplImage imageR = cvCreateImage(cvGetSize(image), image.depth(), 1); IplImage imageG = cvCreateImage(cvGetSize(image), image.depth(), 1); IplImage imageB = cvCreateImage(cvGetSize(image), image.depth(), 1); cvSplit(image, imageR, imageG, imageB, null); // 计算RGB三个通道的直方图 int histSize = 256; CvHistogram histR = cvCreateHist(1, new int[] { histSize }, CV_HIST_ARRAY); CvHistogram histG = cvCreateHist(1, new int[] { histSize }, CV_HIST_ARRAY); CvHistogram histB = cvCreateHist(1, new int[] { histSize }, CV_HIST_ARRAY); cvCalcHist(new IplImage[] { imageR }, histR, 0, null); cvCalcHist(new IplImage[] { imageG }, histG, 0, null); cvCalcHist(new IplImage[] { imageB }, histB, 0, null); // 归一化直方图 float minVal[] = new float[1]; float maxVal[] = new float[1]; FloatPointer minValPointer = new FloatPointer(minVal); FloatPointer maxValPointer = new FloatPointer(maxVal); cvGetMinMaxHistValue(histR, minValPointer, maxValPointer, null, null); cvNormalize(histR, histR, 1, 0, CV_COMP_CHISQR); cvGetMinMaxHistValue(histG, minValPointer, maxValPointer, null, null); cvNormalize(histG, histG, 1, 0, CV_COMP_CHISQR); cvGetMinMaxHistValue(histB, minValPointer, maxValPointer, null, null); cvNormalize(histB, histB, 1, 0, CV_COMP_CHISQR); // 合并三个通道的直方图 int dim = 3; CvSize size = cvGetSize(image); CvMat data = CvMat.create(size.height(), size.width(), CV_32FC1); CvHistogram hist = cvCreateHist(dim, new int[] { histSize, histSize, histSize }, CV_HIST_ARRAY); Pointer pointer = hist.bins(); int ptrOffset = 0; for (int i = 0; i < histSize; i++) { for (int j = 0; j < histSize; j++) { for (int k = 0; k < histSize; k++) { ((FloatPointer) pointer).put(ptrOffset++, (float) (cvGetHistValue_3D(histR, i, j, k) * 0.33 + cvGetHistValue_3D(histG, i, j, k) * 0.33 + cvGetHistValue_3D(histB, i, j, k) * 0.33)); } } } cvSetHistBinRanges(hist, new FloatPointer(new float[] { 0, 256, 0, 256, 0, 256 })); cvCalcHist(data, hist, 0, null); // 归一化直方图 cvNormalize(hist, hist, 1, 0, CV_COMP_CHISQR); // 提取特征向量 float[] featureVector = new float[histSize * histSize * histSize]; FloatPointer featureVectorPointer = new FloatPointer(featureVector); cvGetHistValue_3D(hist, featureVectorPointer); // 释放内存 grayImage.release(); imageR.release(); imageG.release(); imageB.release(); histR.release(); histG.release(); histB.release(); hist.release(); data.release(); return featureVector; } // 计算两张图像的相似度 public static float similarity(IplImage image1, IplImage image2) { // 提取图像指纹 float[] featureVector1 = extract(image1); float[] featureVector2 = extract(image2); // 比较相似度 CvHistogram hist1 = cvCreateHist(1, new int[] { featureVector1.length }, CV_HIST_ARRAY); CvHistogram hist2 = cvCreateHist(1, new int[] { featureVector2.length }, CV_HIST_ARRAY); FloatPointer featureVector1Pointer = new FloatPointer(featureVector1); FloatPointer featureVector2Pointer = new FloatPointer(featureVector2); cvSetHistBinRanges(hist1, new FloatPointer(new float[] { 0, 1 })); cvSetHistBinRanges(hist2, new FloatPointer(new float[] { 0, 1 })); cvCalcHist(new Pointer[] { featureVector1Pointer }, hist1, 0, null); cvCalcHist(new Pointer[] { featureVector2Pointer }, hist2, 0, null); cvNormalize(hist1, hist1, 1, 0, CV_COMP_CHISQR); cvNormalize(hist2, hist2, 1, 0, CV_COMP_CHISQR); float similarity = (float) cvCompareHist(hist1, hist2, CV_COMP_CHISQR); // 释放内存 hist1.release(); hist2.release(); return similarity; } public static void main(String[] args) { IplImage image1 = imread("image1.jpg", CV_LOAD_IMAGE_GRAYSCALE); IplImage image2 = imread("image2.jpg", CV_LOAD_IMAGE_GRAYSCALE); float similarity = similarity(image1, image2); System.out.println("相似度:" + similarity); } } ``` 这个示例代码中的extract()方法用于提取图像指纹,similarity()方法用于计算两张图像的相似度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值