The rectangle coordinate is applied initial region for tracking.
refer to video and source code.
#include < stdio.h> #include < iostream> #include < opencv2\opencv.hpp> //#include < opencv2/core/core.hpp> //#include < opencv2/highgui/highgui.hpp> //#include < opencv2/video/background_segm.hpp> //#include < opencv2\gpu\gpu.hpp> //#include < opencv2\legacy\legacy.hpp> #ifdef _DEBUG #pragma comment(lib, "opencv_core247d.lib") //#pragma comment(lib, "opencv_imgproc247d.lib") //MAT processing //#pragma comment(lib, "opencv_objdetect247d.lib") //HOGDescriptor //#pragma comment(lib, "opencv_gpu247d.lib") //#pragma comment(lib, "opencv_features2d247d.lib") #pragma comment(lib, "opencv_highgui247d.lib") //#pragma comment(lib, "opencv_ml247d.lib") //#pragma comment(lib, "opencv_stitching247d.lib"); //#pragma comment(lib, "opencv_nonfree247d.lib"); //#pragma comment(lib, "opencv_video247d.lib") //#pragma comment(lib, "opencv_legacy247d.lib") #else #pragma comment(lib, "opencv_core247.lib") //#pragma comment(lib, "opencv_imgproc247.lib") //#pragma comment(lib, "opencv_objdetect247.lib") //#pragma comment(lib, "opencv_gpu247.lib") //#pragma comment(lib, "opencv_features2d247.lib") #pragma comment(lib, "opencv_highgui247.lib") //#pragma comment(lib, "opencv_ml247.lib") //#pragma comment(lib, "opencv_stitching247.lib"); //#pragma comment(lib, "opencv_nonfree247.lib"); //#pragma comment(lib, "opencv_video247.lib") //#pragma comment(lib, "opencv_legacy247.lib") #endif using namespace std; using namespace cv; bool selectObject = false; Rect selection; Point origin; int trackObject = 0; Mat image; static void onMouse( int event, int x, int y, int, void* ) { if( selectObject ) { selection.x = MIN(x, origin.x); selection.y = MIN(y, origin.y); selection.width = std::abs(x - origin.x); selection.height = std::abs(y - origin.y); selection &= Rect(0, 0, image.cols, image.rows); } switch( event ) { case CV_EVENT_LBUTTONDOWN: origin = Point(x,y); selection = Rect(x,y,0,0); selectObject = true; break; case CV_EVENT_LBUTTONUP: selectObject = false; if( selection.width > 0 && selection.height > 0 ) trackObject = -1; break; } } int main (void) { VideoCapture cap(0); Mat frame; namedWindow( "Demo", 0 ); setMouseCallback( "Demo", onMouse, 0 ); for(;;) { cap >> frame; if( frame.empty() ) break; frame.copyTo(image); if( selectObject && selection.width > 0 && selection.height > 0 ) { Mat roi(image, selection); bitwise_not(roi, roi); printf("%d %d %d %d\n", selection.x, selection.y, selection.width, selection.height); } imshow( "Demo", image ); if( waitKey(10) > 10 ) break; } return 0; }
Hello, I have the following code, can you please help me with an advice.
ReplyDeleteI have an error at SetMousecallback, more exacly at parameer onMouse (a pointer to member is not valid for a managed class) . I remain grateful.
private: System::Void button5_Click(System::Object^ sender, System::EventArgs^ e) {
src = mOriginalImagesAf.clone();
namedWindow(winName, WINDOW_NORMAL);
setMouseCallback(winName, onMouse, NULL);
imshow(winName, src);
}
void checkBoundary(){
//check croping rectangle exceed image boundary
if (cropRect.width>img.cols - cropRect.x)
cropRect.width = img.cols - cropRect.x;
if (cropRect.height>img.rows - cropRect.y)
cropRect.height = img.rows - cropRect.y;
if (cropRect.x<0)
cropRect.x = 0;
if (cropRect.y<0)
cropRect.height = 0;
}
void showImage(){
img = src.clone();
checkBoundary();
if (cropRect.width>0 && cropRect.height>0){
ROI = src(cropRect);
imshow("cropped", ROI);
}
rectangle(img, cropRect, Scalar(0, 255, 0), 1, 8, 0);
imshow(winName, img);
}
void onMouse(int event, int x, int y, int f, void*){
switch (event){
case CV_EVENT_LBUTTONDOWN:
clicked = true;
P1.x = x;
P1.y = y;
P2.x = x;
P2.y = y;
break;
case CV_EVENT_LBUTTONUP:
P2.x = x;
P2.y = y;
clicked = false;
break;
case CV_EVENT_MOUSEMOVE:
if (clicked){
P2.x = x;
P2.y = y;
}
break;
default: break;
}
if (clicked){
if (P1.x>P2.x){
cropRect.x = P2.x;
cropRect.width = P1.x - P2.x;
}
else {
cropRect.x = P1.x;
cropRect.width = P2.x - P1.x;
}
if (P1.y>P2.y){
cropRect.y = P2.y;
cropRect.height = P1.y - P2.y;
}
else {
cropRect.y = P1.y;
cropRect.height = P2.y - P1.y;
}
}
showImage();
}
μλ νμΈμ μκΎΈ μ§λ¬Έ μ¬λ €λλ € μ£μ‘ν©λλ€.
ReplyDeleteonMouse ν¨μμμ selection &= Rect(0,0,image.cols, image.rows)λ μ ν΄μ£Όλ κ²μΈκ°μ?? x,y μ’νλ₯Ό λ λ¦¬κ³ widthμ height κ°λ§ λ¨κΈ°λ €κ³ νλκ²μΈκ°μ???
λ΅λ³ν΄μ£Όμλ©΄ κ°μ¬νκ² μ΅λλ€.
λ€ μλ νμΈμ.
Deleteλ΅λ³μ΄ λ¦μ΄μ μ£μ‘ν©λλ€.
Rect & Rect λ₯Ό ν μ΄μ λ μ νν rectμ ν¬κΈ°κ° μ΄λ―Έμ§λ³΄λ€ ν¬μ§ μκ² νκΈ° μν΄μ μ λλ€.
μ¬κΈ°μλ μ¬κ°νμ§ μμ§λ§, rect ν¬κΈ°λ‘ μ΄λ€ μμ μ²λ¦¬ μ°μ°μ ν λ μ΄λ―Έμ§λ₯Ό λ²μ΄λκ² λλ κ°μ΄ μμλ μ€λ₯λ₯Ό λ°μ μν¬ μ μμ΅λλ€.
RectA & RectB μ΄λ κ² νλ©΄ μ€λ³΅λλ μμμ rectκ°μ΄ κ³μ°λ©λλ€.
κ·Έλ¬λκΉ μ μΌ inbound ν rectκ° λ§λ€μ΄ μ§λλ°μ..
μ¬κΈ°λ₯Ό μ°Έκ³ νμΈμ.
http://study.marearts.com/2014/09/opencv-tip-rect-bounding.html
κ°μ¬ν©λλ€.