我使用OpenCVfor 计算密集型应用程序iOS.当然很慢.但它比我的PC原型慢了200倍.所以我正在优化它.从最初的15秒开始,我的速度达到了0.4秒.我想知道我是否找到了所有的东西以及其他人想要分享的内容.我做了什么:
将doubleOpenCV中的" "数据类型替换为" float".Double是64bit和32bit CPU无法轻松处理它们,所以float给了我一些速度.OpenCV经常使用double.
-mpfu=neon在编译器选项中添加了" ".副作用是模拟器编译器不再工作的新问题,任何东西都只能在本机硬件上进行测试.
用90个值查找表替换sin()和cos()实现.加速是巨大的!这与PC有些相反,而这种优化并没有给出任何加速.有代码工作在度,这个值转换为弧度为sin()和cos().此代码也已删除.但查找表完成了这项工作.
启用"thumb optimizations".一些博客文章建议完全相反,但这是因为拇指使事情通常较慢armv6.armv7没有任何问题,使事情变得更快更小.
为了确保拇指优化并充分-mfpu=neon发挥作用并且不引入崩溃,我完全删除了armv6目标.我的所有代码都编译到了armv7,这也在app store中列为需求.这意味着最低iPhone会3GS.我认为放弃旧款可以.无论如何,较旧的CPU具有较慢的CPU,如果安装在旧设备上,CPU密集型应用程序会提供糟糕的用户体验
我当然用 -O3 flag
我"dead code"从OpenCV中删除了.通常在优化OpenCV时,我会看到我的项目显然不需要的代码.例如,通常有一个额外"if()"的检查像素大小为8位或32位,我知道我只需要8位.这将删除一些代码,为优化器提供更好的机会来删除更多内容或替换为常量.代码也更适合缓存.
还有其他任何技巧和想法吗?对于我来说,启用拇指和用查找替换三角函数是提升制造商,让我感到惊讶.也许你知道一些让应用程序飞起来的事情吗?
我有以下代码
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <json/json.h>
int main(int argc, char **argv)
{
json_object *new_obj;
char buf[] = "{ \"foo\": \"bar\", \"foo2\": \"bar2\", \"foo3\": \"bar3\" }";
new_obj = json_tokener_parse(buf);
.....
json_object_put(new_obj);
}
Run Code Online (Sandbox Code Playgroud)
是否json_object_put(new_obj)释放所有内存相关new_obj?
我的iOS应用程序是CPU饥饿.它在iPhone 4S上运行良好,在新iPad上运行得更好.但是在iPhone 4上它提供了糟糕的用户体验,我想以某种方式禁用4S下的任何内容从app store下载我的应用程序.我已经强制要求amrv7,但这意味着任何拥有3GS及以上版本的人都可以安装它.我想强制要求双核Cortex A9,因为我使用两个线程来获得我需要的速度.
http://developer.apple.com/library/ios/#documentation/General/Reference/InfoPlistKeyReference/Articles/iPhoneOSKeys.html#//apple_ref/doc/uid/TP40009252-SW3似乎没有列出我想要的东西.最接近的是bluetooth-le,我相信只存在于较新的设备上.有更好的想法吗?
我的目标是从图像中删除阴影.我使用C++和OpenCV.当然,我缺乏足够的数学背景,而不是母语为英语,这使得一切都更难理解.
在阅读了不同的去除阴影的方法之后,我找到了适用于我的方法,但它依赖于他们称之为" 2D色度 "和" 2D对数色度空间 "的东西,但即使这个术语在不同来源中似乎也是不一致的.关于主题的很多论文,很少列在这里:
http://www.cs.cmu.edu/~efros/courses/LBMV09/Papers/finlayson-eccv-04.pdf http://www2.cmp.uea.ac.uk/Research/compvis/Papers/DrewFinHor_ICCV03. pdf http://www.cvc.uab.es/adas/publications/alvarez_2008.pdf http://ivrgwww.epfl.ch/alumni/fredemba/papers/FFICPR06.pdf
我通过搜索正确的单词和解释将Google撕成条状.我发现最好的是照明不变的图像,这对我没什么帮助.
我试图重复第一篇论文第3页中描述的公式日志(G/R),日志(B/R)以获得类似于2b的数字.

作为输入,我使用了http://en.wikipedia.org/wiki/File:Gretag-Macbeth_ColorChecker.jpg
我得到的输出是

我的源代码:
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
using namespace std;
using namespace cv;
int main( int argc, char** argv ) {
Mat src;
src = imread( argv[1], 1 );
if( !src.data )
{ return -1; }
Mat image( 600, 600, CV_8UC3, Scalar(127,127,127) );
int cn = src.channels();
uint8_t* pixelPtr = (uint8_t*)src.data;
for(int i=0 ; i< src.rows;i++) …Run Code Online (Sandbox Code Playgroud) 我尝试使用OpenCV C++的cv :: Moments找到质心.无论我提交什么论点,我收到的全部都是零.显然,我做了一件非常错误的事情.输出代码:
23 of 500 elements in unit 3
point values 2.976444 18.248287
matrix size 23
moments 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
moments 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
Run Code Online (Sandbox Code Playgroud)
和代码:
printf("%d of %d elements in unit %d\n",k,number_of_features,i);
cv::Mat x(k, 1, cv::DataType<cv::Point2f>::type);
k=0;
for(int j=0;j <number_of_features;j++) {
if(i == labels.at<int>(j)) {
x.at<cv::Point2f>(k++) = samples.at<cv::Point2f>(i);
}
}
printf("point values %f %f\n", x.at<cv::Point2f>(0).x,x.at<cv::Point2f>(0).y);
cv::Size s=x.size();
printf("matrix size %d\n",s.height);
cv::Moments m=cv::moments(x);
printf("moments %f %f %f %f %f %f …Run Code Online (Sandbox Code Playgroud) 我需要识别用软笔写的文字上的一些笔迹。使用 OpenCV、不同的阈值方法、双边过滤等,我从纸张中提取文本得到了很好的结果。但我也从折叠中得到了文物:

在处理纸张之前,我无法改变纸张的处理或拍照方式。阈值处理后,同一张纸看起来像这样:

我想删除这些文物。对我来说最大的麻烦是像“T”这样的字符恰好出现在这条线上的情况。“T”的水平部分可能很适合这条线。
我现在要做的:我可以检测是否有独立线路。如果某些东西只有几个像素高且非常宽,我会将其删除。
我一直在阅读很多有关阴影消除的信息(因为我认为问题是阴影)。但他们都希望在其他环境中工作——监控视频或带有彩色背景的图像。
有任何想法吗?
更新:
正在研究基于类似作品的想法:http://ivrgwww.epfl.ch/alumni/fredemba/papers/FFICPR06.pdf
测试输入

测试代码输出:

源代码:
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int filt1_trackbar=13;
int filt2_trackbar=49;
int filt3_trackbar=6;
int main( int argc, char** argv ) {
Mat src, shadow;
src = imread( argv[1], 1 );
if( !src.data ) {
return -1;
}
Mat histImage1( src.rows, src.cols, CV_8UC3, Scalar(127,127,127) );
Mat histImage2( src.rows, src.cols, CV_8UC3, Scalar(127,127,127) );
int cn = src.channels();
uint8_t* pixelPtr = (uint8_t*)src.data;
for(int i=0 ; i< src.rows;i++) {
for(int …Run Code Online (Sandbox Code Playgroud) 在某些原因,谷歌没有使用cvCalcPGH()的好例子,也没有使用Freeman代码进行轮廓匹配的其他好例子.所以我试着去做:
#include "opencv2/opencv.hpp"
#include "opencv2/legacy/legacy.hpp"
int
main(int argc, char* argv[]) {
IplImage* g_gray = cvLoadImage("lisa.png",CV_LOAD_IMAGE_GRAYSCALE);
cvThreshold( g_gray, g_gray, 100, 255, CV_THRESH_BINARY );
CvMemStorage* storage=cvCreateMemStorage(0);
CvSeq* firstContour=NULL;
int a=cvFindContours(g_gray, storage, &firstContour,sizeof(CvChain),CV_RETR_LIST, CV_CHAIN_CODE);
CvHistogram *hist;
int h_bins = 30, s_bins = 30;
float h_ranges[] = { 0, 180 };
float s_ranges[] = { 0, 255 };
int hist_size[] = { h_bins, s_bins };
float* ranges[] = { h_ranges, s_ranges };
hist = cvCreateHist( 2, hist_size, CV_HIST_ARRAY, ranges, 1 );
if( CV_SEQ_ELTYPE( firstContour …Run Code Online (Sandbox Code Playgroud) 我正在使用内置python接口的v2.1.我正在尝试从文件加载图像,将其转换为实验室并从ab平面获取聚类.
我有一个工作的matlab代码,但不知道如何在opencv中做同样的事情.如何重塑jpeg或png图像并将其提供给kmeans?
谢谢
我得到的错误:
OpenCV Error: Assertion failed (labels.isContinuous() && labels.type() == CV_32S && (labels.cols == 1 || labels.rows == 1) && labels.cols + labels.rows - 1 == data.rows) in cvKMeans2, file /build/buildd/opencv-2.1.0/src/cxcore/cxmatrix.cpp, line 1202
Traceback (most recent call last):
File "main.py", line 24, in <module>
(cv.CV_TERMCRIT_EPS + cv.CV_TERMCRIT_ITER, 10, 1.0))
cv.error: labels.isContinuous() && labels.type() == CV_32S && (labels.cols == 1 || labels.rows == 1) && labels.cols + labels.rows - 1 == data.rows
Run Code Online (Sandbox Code Playgroud)
谢谢
工作matlab代码:
im=imread(fName);
cform = makecform('srgb2lab');
lab_im …Run Code Online (Sandbox Code Playgroud) 我在 C++ 中使用 OpenCV 2.4.4,并且我想让 Rect 变大 x 像素。OpenCV 文档提供了很好的示例(查找“按一定量扩展或收缩矩形”)如何在图像中使用它http://opencv.willowgarage.com/documentation/cpp/_images/math/a6f41031fb2ccaa600520bcbde63a8a9fcff9edf.png
凉爽的。唯一的问题是我不知道如何在实际的 C++ 代码中输入它。我试过:
rect rect=oldrect+-10; rect rect=oldrect-+10; 和 rect rect=oldrect±10;(为了确定,我从http://en.wikipedia.org/wiki/Plus-minus_sign复制了这个符号。
我在其中任何一个上都遇到了丑陋的错误。
有人可以解释一下,我应该使用的那个聪明的符号是什么,不可能包含在 HTML 中,所以它被嵌入为图像。