我最近因使用CMake编译我的C++项目而被出售,现在我想开始为我的代码编写一些单元测试.我决定使用Google Test实用程序来帮助解决这个问题,但在入门时需要一些帮助.
我一整天都在阅读各种指南和示例,包括Primer,IBM的介绍以及有关SO(此处和此处)的一些问题以及我已经忘记的其他来源.我意识到那里有很多,但不知怎的,我仍然遇到困难.
我目前正在尝试实施最基本的测试,以确认我已经编译/安装了gtest,并且它无法正常工作.唯一的源文件(testgtest.cpp)被认为几乎完全由该前面的回答:
#include <iostream>
#include "gtest/gtest.h"
TEST(sample_test_case, sample_test)
{
EXPECT_EQ(1, 1);
}
Run Code Online (Sandbox Code Playgroud)
和我关联的CMakeLists.txt如下:
cmake_minimum_required(VERSION 2.6)
project(basic_test)
# Setup testing
enable_testing()
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIR})
# Add test cpp file
add_executable(runUnitTests
testgtest.cpp
)
# Link test executable against gtest & gtest_main
target_link_libraries(runUnitTests ${GTEST_LIBRARY_DEBUG} ${GTEST_MAIN_LIBRARY_DEBUG})
add_test(
NAME runUnitTests
COMMAND runUnitTests
)
Run Code Online (Sandbox Code Playgroud)
请注意,我选择链接gtest_main而不是在cpp文件的末尾提供main,因为我相信这将允许我更容易地将测试扩展到多个文件.
构建生成的.sln文件(在Visual C++ 2010 Express中)时,我很遗憾地得到了一个很长的表单错误列表
2>msvcprtd.lib(MSVCP100D.dll) : error LNK2005: "public: virtual __thiscall std::basic_iostream<char,struct std::char_traits<char> >::~basic_iostream<char,struct std::char_traits<char> >(void)" (??1?$basic_iostream@DU?$char_traits@D@std@@@std@@UAE@XZ) …Run Code Online (Sandbox Code Playgroud) 许多网站使用类的名称,如floatleft,clearfloat,alignright,small,center等描述附加到的类风格.这似乎是有道理的所以写新的内容,你可以很容易地包装(例如)当<div class="clearfloat">...</div>你的元素周围使其行为您想要的方式.
我的问题是,这种命名类的风格是否违背了将内容与表示分离的想法?放置class="floatleft"元素显然是将表示信息放入HTML文档中.
应该避免像这样直接描述附加风格的类名,如果有的话,还有什么替代方案?
为了澄清,这不仅仅是一个如何命名类的问题.例如,语义准确的文档可能类似于:
<div class="foo">Some info about foo</div>
...
<div class="bar">Info about unrelated topic bar</div>
...
<div class="foobar">Another unrelated topic</div>
Run Code Online (Sandbox Code Playgroud)
假设所有这些div需要清除浮点数,css看起来像:
div.foo, div.bar, div.foobar {
clear:both;
}
Run Code Online (Sandbox Code Playgroud)
随着这些清算元素数量的增加,这开始变得丑陋 - 而单一的清算元素class="clearfloat"将起到同样的作用.是否建议根据附加的样式对元素进行分组以避免在CSS中重复,即使这意味着表示信息会蔓延到HTML中?
更新:感谢您的所有答案.普遍的共识似乎是避免这些类名称支持语义名称,或者至少在不妨碍维护的情况下谨慎使用它们.我认为重要的是布局的变化不应该要求对标记进行过多的更改(尽管有些人说如果使整体维护更容易,那么微小的改变是可以的).感谢那些建议其他方法来保持CSS代码更小的人.
我在OpenCV中有两个Mat图像:
Mat ft = Mat::zeros(src.rows,src.cols,CV_32FC1);
Mat h = Mat::zeros(src.rows,src.cols,CV_32FC1);
Run Code Online (Sandbox Code Playgroud)
两个图像都是相同的尺寸,并且是从单个源图像计算出来的.
我想将这两个图像相乘但尝试使用这两个图像
Mat multiply1 = h*ft;
Mat multiply2;
gemm(h,ft,1,NULL,0,multiply2);
Run Code Online (Sandbox Code Playgroud)
但两者都会导致以下断言失败:
OpenCV错误:断言失败(a_size.width == len)在未知函数中,文件... matmul.cpp抛出'cv :: exception'后调用终止
我究竟做错了什么?
我在iPhone上使用OpenCV,需要检测图像中的数字.我将图像分割成较小的图像,因此每个图像只有一个数字(1-9).所有数字都是打印的,不是手写的.
用OpenCV算出数字的最佳方法是什么?
更新:
我已成功找到数字并将其提取出来.它们看起来像这样:
http://img198.imageshack.us/img198/5671/101ht.jpg
http://img824.imageshack.us/img824/539/606yu.jpg
提取它们时,它们的大小相同,依此类推.我已经保存了一堆图像并将它们放在OCR目录中,在那里它们被分类为数字.喜欢:ocr/1/100.jpg 101.jpg ....和ocr/2/200.jpg 201.jpg ....
然后我将使用与Basic OCR教程相同的方法:http://blog.damiles.com/?p = 93
但是,我正在为iPhone编程,不能使用C++代码(编译时出错等),我无法访问highgui.
我尝试使用cvMatchTemplate()并匹配一堆图像,但它看起来很糟糕......
我可以尝试其他任何想法吗?
我正在使用从MIT汽车数据集训练的Haar级联分类器来检测OpenCV中的车辆(使用随OpenCV提供的实用程序进行训练).在调试模式下编译时,这种方法工作得相当好,但是在发布模式下编译时,级联根本不会进行任何检测.在下面的测试图像上运行以下代码可以在调试模式下进行检测,但在发布模式下无任何检测(此行为将继续通过我的数据序列中的所有图像).
你能说出为什么会出现这种情况,更重要的是,在发布模式下运行时我能做些什么才能获得检测?
码
cv::Mat testImage = cv::imread("testImage.png",0);
cv::equalizeHist(testImage, testImage);
cv::CascadeClassifier vehicleCascade;
vehicleCascade.load("cars3.xml");
// Detect vehicles
std::vector<cv::Rect> cars;
vehicleCascade.detectMultiScale(
testImage, // Input image
cars, // Output bounding boxes
1.1, // scale factor - how much image size is reduced at each scale
5, // min neighbours - how many neighbours required to maintain rect
0|CV_HAAR_SCALE_IMAGE, // Not used
cv::Size(30,30), // Min poss object size
cv::Size() // Max poss object size
);
std::cout << "Found " << cars.size() << …Run Code Online (Sandbox Code Playgroud) 有谁碰巧知道为什么OpenCV 2 DescriptorMatcher::radiusMatch()并knnMatch()采取vector<vector<DMatch>>& matches?我有点困惑为什么它不仅仅是一个矢量,因为它只是场景中与训练图像相对应的单个点阵,对吧?
我有这样的事情:
void getMatchingPoints(
const vector<vector<cv::DMatch> >& matches,
const vector<cv::KeyPoint>& keyPtsTemplates,
const vector<cv::KeyPoint>& keyPtsScene,
vector<Vec2f>& ptsTemplate,
vector<Vec2f>& ptsScene
)
{
ptsTemplate.clear();
ptsScene.clear();
for (size_t k = 0; k < matches.size(); k++)
{
for (size_t i = 0; i < matches[k].size(); i++)
{
const cv::DMatch& match = matches[k][i];
ptsScene.push_back(fromOcv(keyPtsScene[match.queryIdx].pt));
ptsTemplate.push_back(fromOcv(keyPtsTemplates[match.trainIdx].pt));
}
}
}
Run Code Online (Sandbox Code Playgroud)
但我对如何实际映射大约有点困惑.一旦我将它们全部放入,对象的位置ptsScene.当我绘制它们时,这些点似乎散落在我身上,所以我想我错过了嵌套向量所代表的含义.
目前,我开始开发涉及人类追踪的计算机视觉应用.我想为将在此项目中记录的视频构建地面实况元数据.元数据可能需要手工标记,并且主要包括图像中人类的位置.我想使用元数据来评估我的算法的性能.
我当然可以使用例如qt和/或opencv构建标签工具,但我想知道是否有某种事实上的标准.我遇到了毒蛇,但它看起来已经死了,并不像我希望的那样容易.除此之外,我没有找到太多.
这里是否有人建议使用哪种软件/标准/方法进行标记和评估?我的主要偏好是去面向c ++,但这不是一个严格的约束.
亲切的问候和提前谢谢!汤姆
evaluation tracking metadata image-processing computer-vision
我正在使用OpenCV 2.3的C++版本,我正在努力完成一项基本任务.我想要做的是创建一个窗口并将其移动到屏幕上的特定位置,例如:
cv::namedWindow("My Window", 1);
cv::MoveWindow("My Window", 10, 10);
Run Code Online (Sandbox Code Playgroud)
但是,似乎MoveWindow()函数不可用.从OpenCV 2.3文档(链接)看来,似乎有C和Python实现,但没有C++.这是否意味着有更好的方法来做到这一点?
从文档的相关部分:
MoveWindow
==========
Moves window to the specified position
--------------------------------------
C: void cvMoveWindow(const char* name, int x, int y)
Python: cv.MoveWindow(name, x, y) ? None
Parameters:
- name – Window name
- x – The new x-coordinate of the window
- y – The new y-coordinate of the window
Run Code Online (Sandbox Code Playgroud)
解决:从最新版本的OpenCV开始,现在有一个cv::MoveWindow("const string& winname, int x, int y)功能.参考这里.
任何人都可以解释一下OpenCV和OpenCL之间有什么区别?什么适合Java中的Android图像处理?
opencv ×7
c++ ×4
android ×1
boost ×1
c ×1
cmake ×1
css ×1
debug-mode ×1
evaluation ×1
googletest ×1
html ×1
java ×1
metadata ×1
ocr ×1
opencl ×1
presentation ×1
python ×1
release-mode ×1
tracking ×1
unit-testing ×1