(1)用鼠标在图中框选矩形目标,然后保存框选的图片;
(2)鼠标拖动过程中要求显示框的线条以及鼠标当前像素点信息(坐标和RGB值);
(3)拖动完成后单独显示框取的图像,拖动完成后cout输出框中心像素点坐标。
鼠标事件:
鼠标左键按下时(event == CV_EVENT_LBUTTONUP),标注鼠标所在点的坐标和RGB信息(cv::putText标注)
鼠标左键抬起时(event == CV_EVENT_LBUTTONDOWN),计算ROI中心点坐标
API:
指定鼠标操作消息回调函数
void setMouseCallback(const String& winname, MouseCallback onMouse, void* userdata = 0)
第一个参数,const String&类型的winname,窗口的名字。(cv::namedWindow创建窗口)
第二个参数,MouseCallback类型的onMouse,指定窗口里每次鼠标时间发生的时候,被调用的函数指针。类型:
void onMouseRectPicking(int event, int x, int y, int flags, void* userdata)
版本:VS2015 + openCV3.4.3
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
cv::Mat img;
bool select_flag = false;
cv::Rect m_select;
cv::Point origin;
int ROI_count;
char temp[100];
char rgb[100];
void onMouseRectPicking(int event, int x, int y, int, void*)
{
if (select_flag)
{
m_select.x = MIN(origin.x, x);
// 不一定要等鼠标弹起才计算矩形框,而应该在鼠标按下开始到弹起这段时间实时计算所选矩形框
m_select.y = MIN(origin.y, y);
m_select.width = abs(x - origin.x);
// 算矩形宽度和高度
m_select.height = abs(y - origin.y);
m_select &= cv::Rect(0, 0, img.cols, img.rows);
// 保证所选矩形框在视频显示区域之内
sprintf_s(temp, "(%d,%d)", x, y);
// 显示当前像素坐标
int b = img.at<cv::Vec3b>(x, y)[0];
int g = img.at<cv::Vec3b>(x, y)[1];
int r = img.at<cv::Vec3b>(x, y)[2];
sprintf_s(rgb, "(%d,%d,%d)", b, g, r);
// 显示当前像素RGB信息
std::string pixelString;
pixelString += temp;
pixelString += rgb;
cv::putText(img, // 图像矩阵
pixelString, // string型文字内容
cv::Point(x, y), // 文字坐标,以左下角为原点
cv::FONT_HERSHEY_SIMPLEX, // 字体类型
1.0, // 字体大小
cv::Scalar(0, 0, 0)); // 字体颜色
cv::imshow("capframe", img);
}
if (event == CV_EVENT_LBUTTONDOWN) // 鼠标左键按下时
{
select_flag = true;
// 鼠标按下的标志赋真值
origin = cv::Point(x, y);
// 保存下来单击捕捉到的点
m_select = cv::Rect(x, y, 0, 0);
// 这里一定要初始化,宽和高为(0,0)
// 是因为在opencv中Rect矩形框类内的点是包含左上角那个点的,但是不含右下角那个点
sprintf_s(temp, "(%d,%d)", x, y);
// 显示当前像素坐标
int b = img.at<cv::Vec3b>(x, y)[0];
int g = img.at<cv::Vec3b>(x, y)[1];
int r = img.at<cv::Vec3b>(x, y)[2];
sprintf_s(rgb, "(%d,%d,%d)", b, g, r);
// 显示当前像素RGB信息
std::string pixelString;
pixelString += temp;
pixelString += rgb;
cv::putText(img, // 图像矩阵
pixelString, // string型文字内容
cv::Point(x, y), // 文字坐标,以左下角为原点
cv::FONT_HERSHEY_SIMPLEX, // 字体类型
1.0, // 字体大小
cv::Scalar(0, 0, 0)); // 字体颜色
cv::imshow("capframe", img);
}
else if (event == CV_EVENT_LBUTTONUP) // 鼠标左键抬起时
{
select_flag = false;
ROI_count++;
sprintf_s(temp, "(%d,%d)", x, y);
// 显示当前像素坐标
int b = img.at<cv::Vec3b>(x, y)[0];
int g = img.at<cv::Vec3b>(x, y)[1];
int r = img.at<cv::Vec3b>(x, y)[2];
sprintf_s(rgb, "(%d,%d,%d)", b, g, r);
// 显示当前像素RGB信息
std::string pixelString;
pixelString += temp;
pixelString += rgb;
cv::putText(img, // 图像矩阵
pixelString, // string型文字内容
cv::Point(x, y), // 文字坐标,以左下角为原点
cv::FONT_HERSHEY_SIMPLEX, // 字体类型
1.0, // 字体大小
cv::Scalar(0, 0, 0)); // 字体颜色
cv::imshow("capframe", img);
int center_x = origin.x + (x - origin.x) / 2;
int center_y = origin.y + (y - origin.y) / 2;
// 计算中心点坐标
std::cout << "框出中心点坐标:" << center_x << "," << center_y << std::endl;
}
}
int main(int argc, char* argv[])
{
img = cv::imread("H:\\猫1.jpg");
bool stop = false;
cv::namedWindow("capframe", CV_WINDOW_AUTOSIZE);
cv::setMouseCallback("capframe", onMouseRectPicking, 0);
char pic_name[50];
ROI_count = 0;
while (!stop)
{
img = cv::imread("H:\\猫1.jpg");
cv::rectangle(img, m_select, cv::Scalar(255, 0, 0), 2, 8, 0); // 画矩形框
cv::imshow("capframe", img);
if ((m_select.x != 0) && (m_select.y != 0) && (m_select.width != 0) && (m_select.height != 0))
{
sprintf_s(pic_name, "ROI_%d.jpg", ROI_count);
cv::Mat ROI = img(m_select);
cv::imshow("ROI_WIN", ROI);
cv::imwrite(pic_name, ROI);
}
char key = static_cast<char>(cv::waitKey(30));
if (key == 27)
stop = true;
}
cv::waitKey(0);
return 0;
}

拖动过程中在 capframe 窗口显示鼠标当前像素点信息(坐标和RGB值),在 ROI_WIN 窗口显示拖动形成的ROI。

拖动完成后cout输出ROI中心像素点坐标,并输出ROI图片到当前目录下。
我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择
我试图在索引页中创建一个超链接,但它没有显示,也没有给出任何错误。这是我的index.html.erb代码。ListingarticlesTitleTextssss我检查了我的路线,我认为它们也没有问题。PrefixVerbURIPatternController#Actionwelcome_indexGET/welcome/index(.:format)welcome#indexarticlesGET/articles(.:format)articles#indexPOST/articles(.:format)articles#createnew_articleGET/article
我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c
我有一个rubyonrails应用程序。我按照facebook的说明添加了一个像素。但是,要跟踪转化,Facebook要求您将页面置于达到预期结果时出现的转化中。即,如果我想显示客户已注册,我会将您注册后转到的页面作为成功对象进行跟踪。我的问题是,当客户注册时,在我的应用程序中没有登陆页面。该应用程序将用户带回主页。它在主页上显示了一条消息,所以我想看看是否有一种方法可以跟踪来自Controller操作而不是实际页面的转化。我需要计数的Action没有页面,它们是ControllerAction。是否有任何人都知道的关于如何执行此操作的gem、文档或最佳实践?这是进入布局文件的像素
目前,Itembelongs_toCompany和has_manyItemVariants。我正在尝试使用嵌套的fields_for通过Item表单添加ItemVariant字段,但是使用:item_variants不显示该表单。只有当我使用单数时才会显示。我检查了我的关联,它们似乎是正确的,这可能与嵌套在公司下的项目有关,还是我遗漏了其他东西?提前致谢。注意:下面的代码片段中省略了不相关的代码。编辑:不知道这是否相关,但我正在使用CanCan进行身份验证。routes.rbresources:companiesdoresources:itemsenditem.rbclassItemi
之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m
如果我在模型中设置验证消息validates:name,:presence=>{:message=>'Thenamecantbeblank.'}我如何让该消息显示在闪光警报中,这是我迄今为止尝试过的方法defcreate@message=Message.new(params[:message])if@message.valid?ContactMailer.send_mail(@message).deliverredirect_to(root_path,:notice=>"Thanksforyourmessage,Iwillbeintouchsoon")elseflash[:error]
我刚刚按照thebootsygempage上的安装说明进行操作在我保存并查看帖子内容之前,一切看起来都不错。这是输出在View中的样子:HeaderSubhead:似乎没有呈现任何html格式,因为它被引号或类似的东西转义了-其他人有这个问题吗?我没有在github页面或SO上看到任何问题来指出我正确的方向。除了遵循gem安装说明之外,我还没有做任何事情,但也许我错过了什么或者只是犯了一个愚蠢的错误。如果你还有什么想知道的,请尽管问。干杯 最佳答案 你需要有这样的东西,转义html: 关