包含opencvconvertto的词条

本篇文章给大家谈谈opencvconvertto,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

opencv如何将mat类型的 0 1二值化数据由CV_8UC1转换到CV_32SC1。

convertTo是可以转换的。下面随机生成了一个1000*1000的0-1 Mat,转换成CV32SC1后,值并没变薯做。

int main(){

const int w = 1000;

Mat u(w, w, CV_8UC1);

srand(time(NULL));

for(int i=0; iu.rows; i++)

for(int j=0; ju.cols; j++)

u.atuchar(i,j) = rand()%2;

Mat t;

u.convertTo(t, CV_32SC1);

cout  boolalpha  (t.type() == CV_32SC1)  endl;

for(int i=0; iu.rows; i++)

for(int j=0; ju.cols; j++)

if(u.atuchar(i,j) != t.atint(i,j))cout  "Err";

}

// 败纯将只打印 true

如果你觉得convertTo不对察手咐,你可以用 at 把元素一个个取出来复制过去。

如何用opencv实现任意联通区域的最大内接圆

代码 1)Two-pass算法的一种实现说明:基于OpenCV和C++实现,领域:4-领域。实现与算法肢腔描述稍有差别(具体为记录具有相等关系的label方法实现上)。 // Connected Component Analysis/Labeling By Two-Pass Algorithm // Author: // Blog : #include iostream #include string #include list #include vector #include map #include opencv2/imgproc/imgproc.hpp #include opencv2/highgui/御慧highgui.hpp void icvprCcaByTwoPass(const cv::Mat _binImg, cv::Mat _lableImg) { /镇饥答/ connected component analysis (4-component) // use two-pass algorithm // 1. first pass: label each foreground pixel with a label // 2. second pass: visit each labeled pixel and merge neighbor labels // // foreground pixel: _binImg(x,y) = 1 // background pixel: _binImg(x,y) = 0 if (_binImg.empty() || _binImg.type() != CV_8UC1) { return ; } // 1. first pass _lableImg.release() ; _binImg.convertTo(_lableImg, CV_32SC1) ; int label = 1 ; // start by 2 std::vectorint labelSet ; labelSet.push_back(0) ; // background: 0 labelSet.push_back(1) ; // foreground: 1 int rows = _binImg.rows - 1 ; int cols = _binImg.cols - 1 ; for (int i = 1; i rows; i++) { int* data_preRow = _lableImg.ptrint(i-1) ; int* data_curRow = _lableImg.ptrint(i) ; for (int j = 1; j cols; j++) { if (data_curRow[j] == 1) { std::vectorint neighborLabels ; neighborLabels.reserve(2) ; int leftPixel = data_curRow[j-1] ; int upPixel = data_preRow[j] ; if ( leftPixel 1) { neighborLabels.push_back(leftPixel) ; } if (upPixel 1) { neighborLabels.push_back(upPixel) ; } if (neighborLabels.empty()) { labelSet.push_back(++label) ; // assign to a new label data_curRow[j] = label ; labelSet[label] = label ; } else { std::sort(neighborLabels.begin(), neighborLabels.end()) ; int smallestLabel = neighborLabels[0] ; data_curRow[j] = smallestLabel ; // save equivalence for (size_t k = 1; k neighborLabels.size(); k++) { int tempLabel = neighborLabels[k] ; int oldSmallestLabel = labelSet[tempLabel] ; if (oldSmallestLabel smallestLabel) { labelSet[oldSmallestLabel] = smallestLabel ; oldSmallestLabel = smallestLabel ; } else if (oldSmallestLabel smallestLabel) { labelSet[smallestLabel] = oldSmallestLabel ; } } } } } } // update equivalent labels // assigned with the smallest label in each equivalent label set for (size_t i = 2; i labelSet.size(); i++) { int curLabel = labelSet[i] ; int preLabel = labelSet[curLabel] ; while (preLabel != curLabel) { curLabel = preLabel ; preLabel = labelSet[preLabel] ; } labelSet[i] = curLabel ; } // 2. second pass for (int i = 0; i rows; i++) { int* data = _lableImg.ptrint(i) ; for (int j = 0; j cols; j++) { int pixelLabel = data[j] ; pixelLabel = labelSet[pixelLabel] ; } } } 2)Seed-Filling种子填充方法说明:基于OpenCV和C++实现;领域:4-领域。 // Connected Component Analysis/Labeling By Seed-Filling Algorithm // Author: // Blog : #include iostream #include string #include list #include vector #include map #include stack #include opencv2/imgproc/imgproc.hpp #include opencv2/highgui/highgui.hpp void icvprCcaBySeedFill(const cv::Mat _binImg, cv::Mat _lableImg) { // connected component analysis (4-component) // use seed filling algorithm // 1. begin with a foreground pixel and push its foreground neighbors into a stack; // 2. pop the top pixel on the stack and label it with the same label until the stack is empty // // foreground pixel: _binImg(x,y) = 1 // background pixel: _binImg(x,y) = 0 if (_binImg.empty() || _binImg.type() != CV_8UC1) { return ; } _lableImg.release() ; _binImg.convertTo(_lableImg, CV_32SC1) ; int label = 1 ; // start by 2 int rows = _binImg.rows - 1 ; int cols = _binImg.cols - 1 ; for (int i = 1; i rows-1; i++) { int* data= _lableImg.ptrint(i) ; for (int j = 1; j cols-1; j++) { if (data[j] == 1) { std::stackstd::pairint,int neighborPixels ; neighborPixels.push(std::pairint,int(i,j)) ; // pixel position: i,j ++label ; // begin with a new label while (!neighborPixels.empty()) { // get the top pixel on the stack and label it with the same label std::pairint,int curPixel = neighborPixels.top() ; int curX = curPixel.first ; int curY = curPixel.second ; _lableImg.atint(curX, curY) = label ; // pop the top pixel neighborPixels.pop() ; // push the 4-neighbors (foreground pixels) if (_lableImg.atint(curX, curY-1) == 1) {// left pixel neighborPixels.push(std::pairint,int(curX, curY-1)) ; } if (_lableImg.atint(curX, curY+1) == 1) {// right pixel neighborPixels.push(std::pairint,int(curX, curY+1)) ; } if (_lableImg.atint(curX-1, curY) == 1) {// up pixel neighborPixels.push(std::pairint,int(curX-1, curY)) ; } if (_lableImg.atint(curX+1, curY) == 1) {// down pixel neighborPixels.push(std::pairint,int(curX+1, curY)) ; } } } } } } 3)颜色标记(用于显示) // Connected Component Analysis/Labeling -- Color Labeling // Author: // Blog : #include iostream #include string #include list #include vector #include map #include stack #include opencv2/imgproc/imgproc.hpp #include opencv2/highgui/highgui.hpp cv::Scalar icvprGetRandomColor() { uchar r = 255 * (rand()/(1.0 + RAND_MAX)); uchar g = 255 * (rand()/(1.0 + RAND_MAX)); uchar b = 255 * (rand()/(1.0 + RAND_MAX)); return cv::Scalar(b,g,r) ; } void icvprLabelColor(const cv::Mat _labelImg, cv::Mat _colorLabelImg) { if (_labelImg.empty() || _labelImg.type() != CV_32SC1) { return ; } std::mapint, cv::Scalar colors ; int rows = _labelImg.rows ; int cols = _labelImg.cols ; _colorLabelImg.release() ; _colorLabelImg.create(rows, cols, CV_8UC3) ; _colorLabelImg = cv::Scalar::all(0) ; for (int i = 0; i rows; i++) { const int* data_src = (int*)_labelImg.ptrint(i) ; uchar* data_dst = _colorLabelImg.ptruchar(i) ; for (int j = 0; j cols; j++) { int pixelValue = data_src[j] ; if (pixelValue 1) { if (colors.count(pixelValue) = 0) { colors[pixelValue] = icvprGetRandomColor() ; } cv::Scalar color = colors[pixelValue] ; *data_dst++ = color[0] ; *data_dst++ = color[1] ; *data_dst++ = color[2] ; } else { data_dst++ ; data_dst++ ; data_dst++ ; } } } } 4)测试程序 // Connected Component Analysis/Labeling -- Test code // Author: // Blog : #include iostream #include string #include list #include vector #include map #include stack #include opencv2/imgproc/imgproc.hpp #include opencv2/highgui/highgui.hpp int main(int argc, char** argv) { cv::Mat binImage = cv::imread("../icvpr.com.jpg", 0) ; cv::threshold(binImage, binImage, 50, 1, CV_THRESH_BINARY_INV) ; // connected component labeling cv::Mat labelImg ; icvprCcaByTwoPass(binImage, labelImg) ; //icvprCcaBySeedFill(binImage, labelImg) ; // show result cv::Mat grayImg ; labelImg *= 10 ; labelImg.convertTo(grayImg, CV_8UC1) ; cv::imshow("labelImg", grayImg) ; cv::Mat colorLabelImg ; icvprLabelColor(labelImg, colorLabelImg) ; cv::imshow("colorImg", colorLabelImg) ; cv::waitKey(0) ; return 0 ; }

[img]

C++,用opencv图像的项目,Rect类 数组转换为CV_8UC1出错。

你的二维数组是不是仅存放图像数据?燃搭如果是这样的话你可以这样做:IplImage* img = cvCreateImage( CvSize size, int depth, int channels ); //size为图像宽高,depth为位皮悉拿深度,channels为通道数

img-imageData = Arr; //Arr为二维数组名陆带

cvNamedWindow( "Image", 1 );//创建窗口

cvShowImage( "Image", img );//显示图像

cvWaitKey(0); //等待按键

cvDestroyWindow( "Image" );//销毁窗口

cvReleaseImage( img ); //释放图像

OpenCV C++(四)----对比度增强

对比度增强或者称为对比度拉伸就是图像增强技术的一种,它主要解决由于图像的灰度级范围较小造成的对比度较低的问题,目的就是将输出图像的灰度级放大到指定的程度,使得图像中的细节看起来更加清晰。对比 度增强有几种常用的方法,如线性变换、分段线性变换、伽马变换、直方图正规化、直方图均衡化、局部自适应直方图均衡化等。

灰度直方图是图像灰度级的函数, 用来描述每个灰度级在图像矩阵中的像素个数或者占有率(概率)。

OpenCV提供了函数 calcHist 来实现直方图的构建,但是在计算8位图的灰度直方图 时,它使用起来略显复杂。下面是OpenCV源码

可以定义函数 calcGrayHist 来计算灰度直方图,其中输入参数为8位图,将返回的灰度直方图存储为一个1行256列的 Mat 类型。

图像对比度是通过灰度级范围来度量的,而灰度级范围可通过观察灰度直方图得到,灰度级范围越大代表对比度越高;反之,对比度越低,低对比度的图像在视觉上给人的感觉是看起来不够清晰,所以通过算法调整图像的灰度值,从而调整图像的对比度是有必要的。最简单的一种对比度增强方法是通过灰度值的线性变换来实现的。

当a=1,b=0时,O为I的一个副本;如果a1,则输出图像O的对 比度比I 有所增大;如果0a 1,则O的对比度比I有所减小。而b值的改变,影响的是输出图像的亮度,当b 0时,亮度增加;当b0时,亮度减小。

在OpenCV中实现一个常数与矩阵相乘有多种方式桥腔。

1、convertTo

注:当输出矩阵的数据类型是 CV_8U 时, 大于255的值会自动截断为255

2、矩阵乘法运算

使用乘法运算符“*”, 无论常数是什么数据类型, 输出矩阵的数据类型总是和输入矩阵的数据类型相同,当数据类型是 CV_8U 时,在返回值中将大于255的值自动截断为255。

3、convertScaleAbs

直方图正规化是一种自动选取a和b的值的线性变换方法。

利用 minMaxLoc 函数不仅可以计算出矩阵中的最大值和最小值, 而且可以求出最大 值的位置和最小值的位置。 当然,

在使用过程中如果只想得到最大值和最小值, 则将其 他的变量值设为 NULL 即可。

OpenCV提供的函数: normalize()

使用函数 normalize 对图像进行对比度增强时, 经常令参数码腔 norm_type=NORM_MINMAX , 和直方图正规化原理详解中提到的计算方法是相同的, 参数 alpha 相当于 Omax , 参数 beta 相当于 Omin 。 注意, 使用 normalize 可以处理多通道矩阵, 分别对每一敏模衫个通道进行正规化操作。

非线性变换 。

假设输入图像为I,宽为W、 高为H,首先将其灰度值归一化到[0,1]范围,对于8位 图来说,除以255即可。 I (r, c) 代表归一化后的第r行第c列的灰度值, 输出图像记为 O, 伽马变换就是令 O(r, c) =I(r, c) γ , 0≤rH, 0≤c W,

当γ=1时, 图像不变。 如果图像整体或者感兴趣区域较暗, 则令0 γ 1可以 增加图像对比度; 相反, 如果图像整体或者感兴趣区域较亮, 则令γ1可以降低图像对比度。

伽马变换在提升对比度上有比较好的效果, 但是需要手动调节γ值。

全局直方图均衡化操作是对图像I进行改变, 使得输出图像O的灰度直方图 hist O 是“平”的, 即每一个灰度级的像素点个数是“相等”的。 注意,其实这里的“相等”不是严格意义上的等于, 而是约等于,

上述分别为I和O的累加直方图

总结,对于直方图均衡化的实现主要分四个步骤:

OpenCV实现的直方图均衡化函数 equalize-Hist , 其使用方法很简单, 只支持对 8位图 的处理。

虽然全局直方图均衡化方法对提高对比度很有效,但是均衡化处理以后暗区域的噪声可能会被放大,变得清晰可 见,而亮区域可能会损失信息。为了解决该问题, 提出了自适应直方图均衡化(Aptive Histogram Equalization) 方法。

自适应直方图均衡化首先将图像划分为不重叠的区域块(tiles) ,然后对每一个块分别进行直方图均衡化。 显然, 在没有噪声影响的情况下, 每一个小区域的灰度直方图会被限制在一个小的灰度级范围内; 但是如果有噪声, 每一个分割的区域块执行直方图均衡化后, 噪声会被放大。为了避免出现噪声这种情况, 提出了“限制对比度”(Contrast Limiting) [3],如果直方图的bin超过了提前预设好的“限制对比度”, 那么会被裁减, 然 后将裁剪的部分均匀分布到其他的bin, 这样就重构了直方图。

OpenCV提供的函数 createCLAHE 构建指向 CLAHE 对象的指针, 其中默认设置“限制 对比度”为40,块的大小为8×8。

opencv中C++实现傅里叶变换,低通滤波以及逆变换问题

网悉郑页链接肯定是滤波的问题,低通还是高通,还睁纳颂有傅里叶反变换的时茄猛候magnitude,normalize的问题

如何在android studio上加入OpenCV库

1.安装 NDK, 下载android-ndk-r8e-windows-x86.zip, 解压至本地(android-ndk-r8e-windows-x86_64.zip解压后不包含prebuilt文件夹,sample中的hello-jni运行报错)

2.配置环境变量$NDKROOT=android-ndk的文件夹路径

3.eclipse安装CDT插件,Eclipse-help-Install software,在"available software sites"中选择相应的CDT路径,安装

4.下明余雹载最新的OpenCV for Anroid库OpenCV-2.4.4-android-sdk.zip ,解压至本地

5.编译生成openCV的jar库文件

1)eclipse中导入激帆OpenCV-2.4.4-android-sdk\sdk\java文件夹毁空

2)添加openCV Library工程的C++工程属性,右键project名称-New-other-C/C++-Convert to a C/C++ Project(Adds C/C++ Nature)

3)为project 配置ndk built路径。右键project-Properties-C/C++ build, 设置Build command: ${NDKROOT}/ndk-build.cmd; behavior选项中的不勾clean

4)编译工程, /bin文件夹下生成opencv library - 2.4.4.jar

6. 在目标Adnroid应用程序中添加对opencv library - 2.4.4.jar 的引用,便可以调用相应的open CV库函数了

关于opencvconvertto和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

标签列表