ITKeyword,专注技术干货聚合推荐

注册 | 登录

opencv各种小功能记录总结(5)

分享于

2020腾讯云双十一活动,全年最低!!!(领取3500元代金券),
地址https://cloud.tencent.com/act/cps/redirect?redirect=1073

2020阿里云最低价产品入口,含代金券(新老用户有优惠),
地址https://www.aliyun.com/minisite/goods

推荐:opencv图像处理总结

opencv图像处理基本操作 1. 矩阵数据类型 通用矩阵数据类型: CV_<bit_depth>(S|U|F)C<number_of_channels> 其中,S表示带符号整数; U表示无符号整数; F表示浮

简介

本文作用,总结记录opencv使用过程中会使用到的各种小功能。 计算消耗时间

在opencv使用中,我们经常会使用到用这个功能来计算某个计算花费的时间,和比较几个算法之间的优劣性。范例代码如下: #include <math.h>#include <string.h>#include <stdio.h>#include <stdlib.h>#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv/cv.h> using namespace cv; int main(int argc,char *argv[]){

double t = (double)getTickCount();

sleep(2);

t = ((double)getTickCount() - t) / getTickFrequency();

printf("Times passed in seconds: %lf\n",t);

return 0;}

getTickCount:获得到目前为止,计算机的Tick数。

getTickFrequency:获得每秒钟,计算机Tick的频率。用当前的getTickCount减去上一次的getTickCount,然后除以getTickFrequency,就获得了这两段之间消耗的时间。 显示查找表LUT

遍历图片的方法很多,但是效率最高的是使用OPENCV自带的LUT,该函数有在芯片上进行优化处理。范例代码如下: #include <opencv2/highgui/highgui.hpp>#include <math.h>#include <string.h>#include <opencv/cv.h>#include <stdio.h> int main(int argc,char *argv[]){

int width,height;

cv::Mat img = cv::imread(argv[1]);

width = img.rows;

height = img.cols;

cv::Mat edges = cv::Mat(width,height,CV_8UC3,cv::Scalar(0,0,0));

cv::Mat lookUpTable(1, 256, CV_8U);

uchar* p = lookUpTable.data;

for( int i = 0; i < 256; ++i)

p[i] = 255 -i;

LUT(img, lookUpTable, edges);

cv::namedWindow("edges");

cv::imshow("edges",edges);

cv::waitKey(0);

return 0;}

首先载入一张图片img,和创建目标文件edges,接着建立一张映射表lookUpTable,让P[i] = 255 -i,最后使用函数LUT。LUT:img为输入图片,edges为输出图片,lookUpTable为映射表,它表示:img中像素值等于i的,都转换为255-i,然后输出给edges对应位置。该范例代码结果为:edges是img的色彩反转图像。 创建空的Mat图像

一般用两种办法创建:

(1) cv::Mat img = cv::Mat(240,320,CV_8UC3,cv::Scalar(0,0,0));

(2) cv::Mat img_2 = cv::Mat::zeros(img.size(), img.type()); 彩色图像灰阶化

直接在cv::imread中带入参数0

cv::Mat img = cv::imread(argv[1]); 取到单个Mat图像数据

代码如下: for(i=0;i<width;i++){

for(j=0;j<height;j++){

edges.at<Vec3b>(i,j)[0] = saturate_cast<uchar>(255 - img.at<Vec3b>(i,j)[0]);

edges.at<Vec3b>(i,j)[1] = saturate_cast<uchar>(255 - img.at<Vec3b>(i,j)[1]);

edges.at<Vec3b>(i,j)[2] = saturate_cast<uchar>(255 - img.at<Vec3b>(i,j)[2]

推荐:Android --小功能 Android中几种图像特效处理 (一)

这一节给大家分享的是Android中几种图像特效处理的小技巧,比如圆角,倒影,还有就是图片缩放,Drawable转化为Bitmap,Bitmap转化为Drawable等等. 废话少说了,直接讲

);

}

}

随机数

在opencv中使用RNG来产生随机数,范例代码如下: #include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <math.h>#include <string.h>#include <opencv/cv.h>#include <stdio.h> using namespace cv; int main(int argc,char *argv[]){

int i;

int icolor;

RNG rng(0xFFFFFFFF);

for(i=0;i<3;i++){

icolor = (unsigned) rng;

printf("icolor=%x\n",icolor);

}

for(i=0;i<3;i++){

icolor = rng.uniform(-10,10);;

printf("icolor=%d\n",icolor);

}

for(i=0;i<3;i++){

icolor = rng.uniform(100,1000);;

printf("icolor=%d\n",icolor);

}

return 0;}

该代码分别在0--0xffffffff,-10到10,100到1000之前分别产生了三个随机数。 Mat/IplImage/CvMat格式转换

opencv中常用的三种格式, 它们之间的转化如下:

Mat img = cv::imread(argv[1]);

IplImage pI = img;

CvMat mI = img;

IplImage* ppI = &img.operator IplImage();

CvMat* mmI = &img.operator CvMat();

没有引用是,自动释放内存的智能指针Ptr:

Mat I = cv::imread(argv[1]);

Ptr<IplImage> piI = &I.operator IplImage();

其他类型转化为Mat,利用构造函数实现:

Mat K(piI), L;

L = Mat(pI); jni中打印Android的log

1、在Android.mk中加入

LOCAL_LDLIBS+= -L$(SYSROOT)/usr/lib -llog

2、接着加入头文件:

#include <android/log.h>

3、最后打印log

__android_log_print(ANDROID_LOG_ERROR, "JNITag","width=%d,height=%d,touch_x=%d,touch_y=%d", width,height,touch_x,touch_y); 不安装manager使用opencv库 简介

如图所示,在Android上使用opencv库做apk,需要先安装opencv manager,如下,一个解决办法,让opencv的apk,不需要先安装manager,直接运行。 步骤

1,新建工程,然后右击工程文件,选择properties->Android->Add,添加OPENCV Library-2.4.9。

2,将/OpenCV-2.4.9-android-sdk/sdk/native/libs下的文件夹armeabi,armeabi-v7a,mips,x86全部添加到/yourApp/libs中。

3,在yourApp的MainActivity.java的适当位置加上OpenCVLoader.initDebug();

需要做的代码修改如下: public void onResume(){

super.onResume();

// OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback);

if(OpenCVLoader.initDebug()){

mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);

System.loadLibrary("opencv_java");

} } 特别注意

需要特别注意,在用ndk新生成c++ so文件之后,可能导致apk的 lib/armeabi-v7a目录下的opencv库全部被干掉,特别注意,如果发现被干倒了,一定要重新复制过来才能运行。

推荐:【OpenCV】OpenCV 2.4版本 图像各种平滑(模糊)处理

平滑也称模糊, 是一项简单且使用频率很高的图像处理方法。 平滑处理时需要用到一个滤波器。 最常用的滤波器是线性滤波器,线性滤波处理的输出像素值(例如:)是

简介   本文作用,总结记录opencv使用过程中会使用到的各种小功能。 计算消耗时间   在opencv使用中,我们经常会使用到用这个功能来计算某个计算花费的时间,和比较几个算法之间的优劣性。

相关阅读排行


相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。