首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >opencv HoughCircle和trackbar

opencv HoughCircle和trackbar
EN

Stack Overflow用户
提问于 2015-09-18 08:58:45
回答 1查看 1.2K关注 0票数 0

我正在研究Hough循环函数。基本上有4个参数,我可以玩,以获得正确的圆圈,我希望。

因此,我想要创建一个跟踪条来监视正在处理的图像的状态。

所以我就这样修改了我的代码

代码语言:javascript
复制
#include <sstream>
#include <string>
#include <iostream>
#include <vector>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <opencv\cv.h>
#include <opencv\highgui.h>
#include <stdlib.h>
#include <stdio.h>

using namespace std;
using namespace cv;


int main(int argc, char** argv) {

//Create a window for trackbars
namedWindow("Trackbar Window", CV_WINDOW_AUTOSIZE);

//Create trackbar to change brightness
int iSliderValue1 = 50;
createTrackbar("Brightness", "Trackbar Window", &iSliderValue1, 100);

//Create trackbar to change contrast
int iSliderValue2 = 50;
createTrackbar("Contrast", "Trackbar Window", &iSliderValue2, 100);

int param1 = 10;
createTrackbar("param1", "Trackbar Window", &param1, 300);

int param2 = 10;
createTrackbar("param2", "Trackbar Window", &param2, 300);



Mat src;

VideoCapture capture;

capture.open("movingBall.wmv");
capture.read(src);
capture.set(CV_CAP_PROP_FRAME_HEIGHT, 480);
capture.set(CV_CAP_PROP_FRAME_WIDTH, 640);


if (!src.data) {
    std::cout << "ERROR:\topening image" << std::endl;
    return -1;
}
cv::namedWindow("image1", CV_WINDOW_AUTOSIZE);

cv::namedWindow("image2", CV_WINDOW_AUTOSIZE);

while (true){

    capture.read(src);
    Mat dst;
    int iBrightness = iSliderValue1 - 50;
    double dContrast = iSliderValue2 / 50.0;

    src.convertTo(src, -1, dContrast, iBrightness);

cv::imshow("image1", src);

Mat src_gray2;
cvtColor(src, src_gray2, CV_BGR2GRAY);

GaussianBlur(src_gray2, src_gray2, cv::Size(9, 9), 2, 2);

vector<Vec3f> circles;

HoughCircles(src_gray2, circles, CV_HOUGH_GRADIENT,
    2,   // accumulator resolution (size of the image / 2)
    5,  // minimum distance between two circles
    param1, // Canny high threshold
    param2, // minimum number of votes
    0, 0); // min and max radius

std::cout << circles.size() << std::endl;
std::cout << "end of test" << std::endl;


for (size_t i = 0; i < circles.size(); i++)
{
    Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
    int radius = cvRound(circles[i][2]);
    circle(src, center, 3, Scalar(0, 255, 0), -1, 8, 0);
    // circle outline
    circle(src, center, radius, Scalar(0, 0, 255), 3, 8, 0);
}

/*std::vector<cv::Vec3f>::
    const_iterator itc = circles.begin();

while (itc != circles.end()) {

    cv::circle(src_gray2,
        cv::Point((*itc)[0], (*itc)[1]), // circle centre
        (*itc)[2],       // circle radius
        cv::Scalar(0,0,0), // color
        2);              // thickness

    ++itc;
}*/

cv::imshow("image2", src_gray2);

cvWaitKey(33);
}
return 0;
}

正如在Hough循环函数中所看到的,我使用int param1;作为我希望更改的值。但是,代码没有语法错误,但无法编译。我想知道我的履带设置是否出了什么问题。谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-21 06:11:07

我已经用Python试过了,你可以尝试从它移植.

代码语言:javascript
复制
import cv2
import numpy as np

img = cv2.imread('C:/Python34/images/2.jpg',0)
cv2.namedWindow('image')
def nothing(x):
    pass
cv2.createTrackbar('Param 1','image',0,100,nothing)
cv2.createTrackbar('Param 2','image',0,100,nothing)
switch = '0 : OFF \n1 : ON'
cv2.createTrackbar(switch, 'image',0,1,nothing)

while(1):
    cv2.imshow('image',img)
    k = cv2.waitKey(1) & 0xFF
    if k == 27:
        break
    #To Get Parameter values from Trackbar Values
    para1 = cv2.getTrackbarPos('Param 1','image')
    para2 = cv2.getTrackbarPos('Param 2','image')
    s = cv2.getTrackbarPos(switch,'image')
    if s == 0:
        cv2.imshow('image', img)
    else:
    #For finding Hough Circles according to trackbar parameters
        circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,20,para1,para2,minRadius=0,maxRadius=0)
        circles = np.uint16(np.around(circles))
        #For drawing Hough Circles
        for i in circles[0,:]:
           cv2.circle(img,(i[0],i[1]),i[2],(0,255,0),2)
           cv2.circle(img,(i[0],i[1]),2,(0,0,255),3)
           cv2.imshow('image', img)
        cv2.waitKey(0)
        img = cv2.imread('C:/Python34/images/2.jpg',0)


cv2.destroyAllWindows()

您可以使用上面的代码作为参考,首先它为开关创建窗口和跟踪条,为hough圆创建两个参数。然后,在时间环中,para1和para2将跟踪条的位置作为canny参数的值存储。然后将此应用于cv2. cv2.HoughCircles函数,并绘制圆。图像将再次加载,因此每次更改参数时,都会在新图像上给出输出,以避免混淆。

希望这可能有用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32647897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档