各位前輩好
小弟目前以Opencv搭配滑鼠事件畫線
將圖片上任一點已鼠標點擊即可顯示座標
並且將任意點擊之兩點畫線
現在小弟遇到之問題為
若要再任意點擊兩點
所出現之線段則變成
第一次循環之第一點&第二次循環之第二點 之間的連線
附上代碼
請求各位前被指點指點
#include
#include
#include
#include
#include
#include
using namespace cv;
using namespace std;
float fontFace = FONT_HERSHEY_COMPLEX;
double fontScale = 1;
float thickness = 1.5;
char text[10];
Mat img = imread("C:/Hough Lines/Hough Lines Add.jpg");
void CallBackFunc(int event, int x, int y, int flags, void* userdata)
{
if (event == EVENT_LBUTTONDOWN)
{
//cout << "Left button of the mouse is clicked - position (" << x << ", " << y << ")" << endl;
sprintf_s(text, "(%d,%d)", x, y);
putText(img, text, Point(x, y), fontFace, fontScale, Scalar(255, 255, 255), thickness, 1);
circle(img, Point(x, y), 5, Scalar(255, 255, 0), CV_FILLED);
imshow("Mouse Event", img);
void count();
{
static int cnt = 0;
cnt = cnt + 1; //cout << "It have been called " << cnt << " times" << endl;
static int pt1x = x;
static int pt1y = y;
if (cnt == 1)
{
int pt1x = x;
int pt1y = y;
cout << "point1.x = " << pt1x << endl;
cout << "point1.y = " << pt1y << endl << endl;
}
if (cnt == 2)
{
int pt2x = x;
int pt2y = y;
cout << "point2.x = " << pt2x << endl;
cout << "point2.y = " << pt2y << endl << endl;
line(img, Point(pt1x, pt1y), Point(x, y), Scalar(255, 255, 0), 2);
imshow("Mouse Event", img);
double length,angle;
length = sqrt((pt1x - x)*(pt1x - x) + (pt1y - y)*(pt1y - y));
angle = cos(length/(x-pt1x));
cout << "Length = " << length << endl << endl; //cout << "Angle = " << angle << endl;
cnt = 0;
static int pt1x = NULL;
static int pt1y = NULL;
}
}
}
}
int main()
{
Mat srcImage = imread("C:/Hough Lines/Original_Thresh_Binary_image.jpg");
Mat midImage, dstImage;
Mat GaussianBlur1;
if (!srcImage.data)
{
printf("Can't find any data!");
return -1;
}
Canny(srcImage, midImage, 150, 255, 3);
cvtColor(midImage, GaussianBlur1, CV_GRAY2BGR);
GaussianBlur(midImage, GaussianBlur1, Size(5, 5), 0, 0);
vector<Vec4i> lines;
HoughLinesP(GaussianBlur1, lines, 1, CV_PI / 180, 80, 50, 10);
for (size_t i = 0; i < lines.size(); i++)
{
Vec4i l = lines[i];
line(GaussianBlur1, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(186, 88, 255), 1, CV_AA);
}
//imshow("【Display1】", srcImage);
//imshow("【Display2】", midImage);
//imshow("【Display3】", GaussianBlur1);
imwrite("C:/Hough Lines/GaussianBlur1.jpg", GaussianBlur1);
Mat OTB2 = imread("C:/Hough Lines/Original_Thresh_Binary_image2.jpg");
Mat mid2;
Mat GaussianBlur2;
if (!OTB2.data)
{
printf("Can't find Original_Thresh_Binary_image2.jpg !");
return -2;
}
Canny(OTB2, mid2, 150, 255, 3);
cvtColor(mid2, GaussianBlur2, CV_GRAY2BGR);
GaussianBlur(mid2, GaussianBlur2, Size(5, 5), 0, 0);
vector<Vec4i> lines2;
HoughLinesP(GaussianBlur2, lines2, 1, CV_PI / 180, 80, 50, 10);
for (size_t i = 0; i < lines2.size(); i++)
{
Vec4i l = lines2[i];
line(GaussianBlur2, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(186, 88, 255), 1, CV_AA);
}
//imshow("【Display4】", OTB2);
//imshow("【Display5】", mid2);
//imshow("【Display6】", GaussianBlur2);
imwrite("C:/Hough Lines/GaussianBlur2.jpg", GaussianBlur2);
// GaussianBlur1+ GaussianBlur2
Mat GaussianBlur1_add = imread("C:/Hough Lines/GaussianBlur1.jpg");
Mat GaussianBlur2_add = imread("C:/Hough Lines/GaussianBlur2.jpg");
if (GaussianBlur1_add.empty() || GaussianBlur2_add.empty())
{
if (GaussianBlur1_add.empty())
{
printf("Can't find the file GaussianBlur1.jpg!");
}
else
{
printf("Can't find the file GaussianBlur2.jpg!");
}
return -3;
}
Mat img_add;
Size size(GaussianBlur1_add.cols + GaussianBlur2_add.cols,
MAX(GaussianBlur1_add.rows, GaussianBlur2_add.rows));
img_add.create(size, CV_MAKETYPE(GaussianBlur1_add.depth(), 3));
img_add = Scalar::all(0);
Mat outImg_left, outImg_right;
outImg_left = img_add(Rect(0, 0, GaussianBlur1_add.cols, GaussianBlur1_add.rows));
outImg_right = img_add(Rect(GaussianBlur1_add.cols, 0, GaussianBlur1_add.cols, GaussianBlur1_add.rows));
GaussianBlur1_add.copyTo(outImg_left);
GaussianBlur2_add.copyTo(outImg_right);
//namedWindow("Add", WINDOW_AUTOSIZE);
//imshow("Add", img_add);
imwrite("C:/Hough Lines/Hough Lines Add.jpg",img_add);
//
// Read image from file
Mat mouse_img = imread("C:/Hough Lines/Hough Lines Add.jpg");
Mat img;
//if fail to read the image
if (mouse_img.empty())
{
cout << "Error loading the image" << endl;
return -4;
}
namedWindow("Mouse Event", 1);
mouse_img.copyTo(img);
imshow("Mouse Event", mouse_img);
setMouseCallback("Mouse Event", CallBackFunc, (void*)(&img));
waitKey(0);
destroyWindow("Mouse Event");
return 0;
}
static int pt1x = x;
static int pt1y = y;
if (cnt == 1)
{
int pt1x = x;
int pt1y = y; // 你第一次存的点,存到局部变量里了,没有存到上面定义的static变量。
cout << "point1.x = " << pt1x << endl;
cout << "point1.y = " << pt1y << endl << endl;
}