رابط گرافیکی اپن سی وی
- ۰ نظر
- ۱۳ شهریور ۹۵ ، ۱۸:۴۳
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <iostream> using namespace cv;
using namespace std;
int main()
{ // Create a structuring element (SE)
int morph_size = 3;
Mat element = getStructuringElement( MORPH_ELLIPSE, Size( 4*morph_size + 1, 2*morph_size+1 ), Point( morph_size, morph_size ) );
cout<<element;
return 0;
} |
Lets start by thresholding the input image for anything that is not red. Instead of the usual RGB color space we are going to use the HSV space, which has the desirable property that allows us to identify a particular color using a single value, the hue, instead of three values. As a side note, in OpenCV H has values from 0 to 180, S and V from 0 to 255. The red color, in OpenCV, has the hue values approximately in the range of 0 to 10 and 160 to 180.
Next piece of code converts a color image from BGR (internally, OpenCV stores a color image in the BGR format rather than RGB) to HSV and thresholds the HSV image for anything that is not red:
1 ...
2 // Convert input image to HSV
3 cv::Mat hsv_image;
4 cv::cvtColor(bgr_image, hsv_image, cv::COLOR_BGR2HSV);
5
6 // Threshold the HSV image, keep only the red pixels
7 cv::Mat lower_red_hue_range;
8 cv::Mat upper_red_hue_range;
9 cv::inRange(hsv_image, cv::Scalar(0, 100, 100), cv::Scalar(10, 255, 255), lower_red_hue_range);
10 cv::inRange(hsv_image, cv::Scalar(160, 100, 100), cv::Scalar(179, 255, 255), upper_red_hue_range);
11 ...
Preprocess the image using cv::inRange() with the necessary color bounds to isolate red. You may want to transform to a color-space like HSV or YCbCr for more stable color bounds because chrominance and luminance are better separated. You can use cvtColor() for this. Check out my answer here for a good example of using inRange()
with createTrackbar()
.
So, the basic template would be:
Mat redColorOnly;
inRange(src, Scalar(lowBlue, lowGreen, lowRed), Scalar(highBlue, highGreen, highRed), redColorOnly);
detectSquares(redColorOnly);
EDIT : Just use the trackbars to determine the color range you want to isolate, and then use the color intervals you find that work. You don't have to constantly use the trackbars.
EXAMPLE :
So, for a complete example of the template here you go,
I created a simple (and ideal) image in GIMP, shown below:
Then I created this program to filter all but the red squares:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace std;
using namespace cv;
Mat redFilter(const Mat& src)
{
assert(src.type() == CV_8UC3);
Mat redOnly;
inRange(src, Scalar(0, 0, 0), Scalar(0, 0, 255), redOnly);
return redOnly;
}
int main(int argc, char** argv)
{
Mat input = imread("colored_squares.png");
imshow("input", input);
waitKey();
Mat redOnly = redFilter(input);
imshow("redOnly", redOnly);
waitKey();
// detect squares after filtering...
return 0;
}
NOTE : You will not be able to use these exact same filter intervals for your real imagery; I just suggest you tune the intervals with trackbars to see what is acceptable.
The output looks like this:
Viola! Only the red square remains :)
Enjoy :)
https://github.com/Ehsan-Shahnazi/EyeWriter
http://forum.ubuntu.ir/index.php?topic=139001.msg1100616#msg1100616
بعد از تایید نمایش داده می شود.
http://www.eca.ir/forums/thread73293.html#post630660
http://www.noavarangermi.ir/forum/thread495-66.html
فروم اپن سی وی
http://answers.opencv.org/question/101032/calibration-between-move-mouse-move-pupil-eye-writer/
نجوه کالیبره کردن
الگوریتم Viola-Jones برای تشخیص چهره
این پست در پاسخ یکی از خوانندگان قرار داده شده ( درخواست موضوع )
Viola - Jones الگوریتم AdaBoost رو با Cascade واسه تشخیص چهره ترکیب کردن . الگوریتم پیشنهادی شون می تونست چهره رو تو یه تصویر 384×288 با صرف زمانی معادل 0.067 ثانیه تشخیص بده. یعنی 15 بار سریع تر از آشکار ساز های state-of-the-art با دقتی بالاتر ، به طوریکه این الگوریتم یکی از پیشرفته ترین الگوریتم های ماشین بینایی در دهه ی گذشته تا به حال بوده . اما یه توضیح مختصر در مورد این که نقش AdaBoost در این الگوریتم چیه ؟ می تونه این باشه که : در ابتدا تصویر مورد نظر به زیر تصاویر ( 24×24 ) تقسیم بندی میشه. هر زیر تصویر بیانگر یه بردار ویژگی هستش. واسه این که محاسبات موثر و کارآمد باشه ، از یه سری ویژگی های خیلی ساده استفاده می کنیم . تمام مستطیل های ممکن تو زیر تصویر بررسی میشن. در هر مستطیل ، 4 نمونه ویژگی به کمک ماسک هایی که در شکل زیر اومده استخراج میشه . ( 4 ماسک ویژگی که واسه هر مستطیل استفاده میشه )
با هرکدوم از این ماسکها ، مجموع پیکسل های سطح خاکستری در نواحی سفید از مجموع پیکسل ها ی نواحی سیاه ، کم میشه. که این مقدار به عنوان یه ویژگی در نظر گرفته میشه. پس می تونیم اینطوری بگیم که تو یه زیر تصویر ( 24×24 ) بالغ بر 1 میلیون ویژگی می تونیم داشته باشیم ( البته این ویژگی ها خیلی سریع محاسبه میشن !! و می تونن کمتر از 1 میلیون ویژگی هم باشن مثلا 160000 در هر زیر تصویر )
هر ویژگی به عنوان یه یادگیرنده ی ضعیف در نظر گرفته می شه، یعنی :
الگوریتم یادگیری پایه تلاش میکنه که بهترین کلاسیفایر ضعیف رو که ، کوچیک ترین خطا رو در کلاسبندی داره پیدا کنه.
مستطیل های چهره رو به عنوان مثالهای positive در نظر میگیریم. تو شکل زیر اومده:( مثالهای آموزشی مثبت)
و مستطیل هایی که شامل تمام چهره نمیشن ، به عنوان مثالهای آموزشی Negative تلقی میشن. سپس الگوریتم AdaBoost رو اعمال میکینم ، ایشون تعدادی یادگیرنده ی ضعیف رو برمیگردونن ، که هرکدوم از اینا مربوط به یکی از 1 میلیون ویژگی هایی هست که داریم. درواقع اینجا ، AdaBoost می تونه به عنوان یه ابزار واسه انتخاب ویژگی در نظر گرفته بشه.
در ابتدا دو تا ویژگی و موقعیت مربوط به اونا در چهره انتخاب میشه . بدیهی که هر دو ویژگی بصری هستن. که اولین ویژگی اختلاف مقدار شدت روشنایی نواحی چشم و قسمتهای پایین تر از اون رو اندازه گیری میکنه و دومین ویژگی اختلاف مقدار شدت روشنایی نواحی چشمها با نواحی بین چشمها رو اندازه میگیره . با استفاده از ویژگی های انتخاب شده ، یه درخت نامتعادل ساخته میشه که بهش کلاسیفایر Cascade میگن . به شکلها دقت کنین :
پارامتر در Cascade تنظیم میشه به طوریکه ، در هر نود درخت ، ما یه انشعاب not a face داریم و معنیش اینه که تصویر ، یه تصویر چهره نبوده ، یا به عبارت دیگه ، نرخ false negative داره به حداقل میرسه. ایده ی این طرح در واقع می خواد بگه تصویر غیره چهره زودتر شناسایی میشه. به طور متوسط در هر زیر تصویر 10 تا ویژگی رو مورد بررسی قرار میدیم. اینم تعدادی آزمایش که Viola – Jones روی تصاویر انجام دادن :
البته می شه از جعبه ابزار متلب هم واسه تشخیص چهره با الگوریتم Viola - Jones استفاده کرد به این صورت
close all
clc
%Detect objects using Viola-Jones Algorithm
%To detect Face
FDetect = vision.CascadeObjectDetector;
%Read the input image
I = imread('face3.jpg');
%Returns Bounding Box values based on number of objects
BB = step(FDetect,I);
figure,
imshow(I); hold on
for i = 1:size(BB,1)
rectangle('Position',BB(i,:),'LineWidth',5,'LineStyle','-','EdgeColor','r');
end
title('Face Detection');
hold off;
http://blogsoftware.blogfa.com/1392/07/3
روش Viola-Jones یکی از روش های بسیار موفق و سریع در تشخیص چهره بشمار می آید.
بحث در این باره بسیار زیاد است و من مختصرا بصورت فهرست وار بیان می کنم.
معمولا این روش با استفاده از Bossting کار خود را انجام می دهد در الگوریتم های بوستینگ بصورت تکراری سعی می شود نتایج بهبود یابند.
عمدتا روش ویولا-جونز با استفاده از ویژگی شبه هار (Haar Features) کار خود را انجام میدهد و در آن مقاله معروف آقای ویولا و جونز در 2001 به استفاده از یک روش سریع برای محاسبه مقدار ویژگی های شبه هار با عنوان Integral Image اشاره شده است. این مقاله تاکنون بیش از 5000 رفرنس داده شده دارد و هنوز زمینه تحقیقات پیرامون این موضوع باز است.
همچنین جهت اطلاعات بیشتر به تاپیکی که خانم ریحانه تهیه کرده اند مراجعه فرمایید.
http://artificial.ir/intelligence/thread2338.html
sudo su
cd /home/elinux/opencv-3.1.0/build
cmake -DOPENCV_EXTRA_MODULES_PATH=/home/elinux/opencv_contrib-master/modules -DBUILD_opencv_legacy=OFF /home/elinux/opencv-3.1.0
I created a device similar to a wiimote and i want to use it as a mouse in windows (8.1). The device connects over tcp to a c++ win32 program on my windows computer and sends the position where the mouse cursor should move. I am using the SetCursorPos function to set the position, which works great to control most programs. But when I try to control for example the task manager, the cursor doesn't move anymore. When I switch from the task manager back to some other program it works again. I also tried to use the SendInput function with the same results. This is what my code looks like with SendInput:
With SetCursorPos it's just one line:
Can anybody tell me why it doesn't work for some programs? I know it has to be possible to do this, since I tried a smartphone app which controls the cursor and it worked in all programs. You cannot set the cursor position or input of a window that required higher privileges than your program has.. If you want your program to be able to move the cursor over task manager, you require the same privileges as task manager: Administrator Privileges. This is how it is done on Windows 8+. I tried it with the following:
Cursor only moves over task manager when ran as admin. It is the same for all context menus and windows in Windows 8+. Not just task manager. |
https://msdn.microsoft.com/en-us/library/windows/desktop/ms648394(v=vs.85).aspx
http://docs.opencv.org/3.1.0/dc/d3b/classcv_1_1viz_1_1MouseEvent.html#details
اینا برای این هست که مختصات موس به برنامه ای که با اپن سی وی نوشته شده داده بشه. در صورتی که من برعکسش رو میخوام.
یعنی میخوام مختصات از برنامه به موس داده بشه. که توابعی در اپن سی وی برای این کار وجود نداره.
باید در سی ++ به دنبال کتابخونه ای که اینکار رو انجام میده بگردم.
http://randomlinux.com/around-the-web/xdotool-mouse/
این کد رو داخل ترمینال بزنی موس به مختصات 500 و 500 میره
xdotool mousemove 500 500
برای استفاده در برنامه هایی که به زبان سی ++ نوشه می شوند باید کتابخانه های
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <vector>
اینکلود شده باشند.
---------------------------------------
You can download this OpenCV visual C++ project from here
Detect Mouse Clicks and Moves Over the OpenCV Window |