level 1
ASAKingpin
楼主
图像在实现阈值化后,想对图像进行键盘操作,但程序编出来后,键盘操作无反应,程序如下:
//main()函数
int main()
{
g_srcImage = imread("2.jpg");
medianBlur(g_srcImage, out, 9); //中值滤波
cvtColor(out, g_grayImage, COLOR_RGB2GRAY);//转换为灰度图
namedWindow(WINDOW_NAME, WINDOW_NORMAL);
createTrackbar("模式", WINDOW_NAME, &g_nThreshouldType, 4, on_Threshold);
createTrackbar("阈值", WINDOW_NAME,&g_nThreshouldValue, 255, on_Threshold);
on_Threshold(0, 0);
}
//on_Threshold()函数部分
void on_Threshold(int, void*) //回调函数
{
threshold(g_grayImage, g_dstImage, g_nThreshouldValue, 255, g_nThreshouldType);//固定阈值操作
Canny(g_dstImage, g_dstImage, 3, 9, 3); //Canny边缘检测
findContours(g_dstImage, g_vContours, g_vHierarchy, RETR_TREE, CHAIN_APPROX_NONE);//寻找轮廓
std::cout << g_vContours.size() << std::endl;
Mat drawing = Mat::zeros(g_dstImage.size(), CV_8UC1);//绘制轮廓
for (int i = 0; i < g_vContours.size(); i++)
{
Scalar color = Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255));
drawContours(drawing, g_vContours, i, color, 2, 8, g_vHierarchy);
}
rects = Rect(0, 0, drawing.cols, drawing.rows);
a_grayImage = Mat::zeros(drawing.rows * 2, drawing.cols * 4, drawing.type());//设置移动区域a
b_grayImage = Mat::zeros(drawing.rows * 2, drawing.cols * 4, drawing.type());//设置移动区域b
Mat ImageROI = a_grayImage(Rect(0, 0, drawing.cols, drawing.rows));
addWeighted(ImageROI, 0.1, drawing, 1, 0., ImageROI);
imshow(WINDOW_NAME, a_grayImage);
while (1)
{
int key = waitKey(10);
switch (key)
{
case'w':
rects = Rect(rects.x, rects.y - 20, drawing.cols, drawing.rows);
if (rects.y <= 0)
{
rects.y = 0;
}
moveImage();
break;
case's':
rects = Rect(rects.x, rects.y + 20, drawing.cols, drawing.rows);
if (rects.y >= drawing.rows)
{
rects.y = drawing.rows;
}
moveImage();
break;
case'a':
rects = Rect(rects.x - 20, rects.y, drawing.cols, drawing.rows);
if (rects.x <= 0)
{
rects.x = 0;
}
moveImage();
break;
case'd':
rects = Rect(rects.x + 20, rects.y, drawing.cols, drawing.rows);
if (rects.x >= drawing.cols)
{
rects.x = drawing.cols;
}
moveImage();
break;
}
waitKey(0)
}
}
void moveImage()
{
b_grayImage.copyTo(a_grayImage);
Mat ImageROI = a_grayImage(rects);
addWeighted(ImageROI, 0.1, drawing, 1, 0., ImageROI);
imshow(WINDOW_NAME, a_grayImage);
}
2017年04月19日 02点04分
1
//main()函数
int main()
{
g_srcImage = imread("2.jpg");
medianBlur(g_srcImage, out, 9); //中值滤波
cvtColor(out, g_grayImage, COLOR_RGB2GRAY);//转换为灰度图
namedWindow(WINDOW_NAME, WINDOW_NORMAL);
createTrackbar("模式", WINDOW_NAME, &g_nThreshouldType, 4, on_Threshold);
createTrackbar("阈值", WINDOW_NAME,&g_nThreshouldValue, 255, on_Threshold);
on_Threshold(0, 0);
}
//on_Threshold()函数部分
void on_Threshold(int, void*) //回调函数
{
threshold(g_grayImage, g_dstImage, g_nThreshouldValue, 255, g_nThreshouldType);//固定阈值操作
Canny(g_dstImage, g_dstImage, 3, 9, 3); //Canny边缘检测
findContours(g_dstImage, g_vContours, g_vHierarchy, RETR_TREE, CHAIN_APPROX_NONE);//寻找轮廓
std::cout << g_vContours.size() << std::endl;
Mat drawing = Mat::zeros(g_dstImage.size(), CV_8UC1);//绘制轮廓
for (int i = 0; i < g_vContours.size(); i++)
{
Scalar color = Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255));
drawContours(drawing, g_vContours, i, color, 2, 8, g_vHierarchy);
}
rects = Rect(0, 0, drawing.cols, drawing.rows);
a_grayImage = Mat::zeros(drawing.rows * 2, drawing.cols * 4, drawing.type());//设置移动区域a
b_grayImage = Mat::zeros(drawing.rows * 2, drawing.cols * 4, drawing.type());//设置移动区域b
Mat ImageROI = a_grayImage(Rect(0, 0, drawing.cols, drawing.rows));
addWeighted(ImageROI, 0.1, drawing, 1, 0., ImageROI);
imshow(WINDOW_NAME, a_grayImage);
while (1)
{
int key = waitKey(10);
switch (key)
{
case'w':
rects = Rect(rects.x, rects.y - 20, drawing.cols, drawing.rows);
if (rects.y <= 0)
{
rects.y = 0;
}
moveImage();
break;
case's':
rects = Rect(rects.x, rects.y + 20, drawing.cols, drawing.rows);
if (rects.y >= drawing.rows)
{
rects.y = drawing.rows;
}
moveImage();
break;
case'a':
rects = Rect(rects.x - 20, rects.y, drawing.cols, drawing.rows);
if (rects.x <= 0)
{
rects.x = 0;
}
moveImage();
break;
case'd':
rects = Rect(rects.x + 20, rects.y, drawing.cols, drawing.rows);
if (rects.x >= drawing.cols)
{
rects.x = drawing.cols;
}
moveImage();
break;
}
waitKey(0)
}
}
void moveImage()
{
b_grayImage.copyTo(a_grayImage);
Mat ImageROI = a_grayImage(rects);
addWeighted(ImageROI, 0.1, drawing, 1, 0., ImageROI);
imshow(WINDOW_NAME, a_grayImage);
}