2015-09-18 2 views
0

Я ищу функцию Hough Circle. Есть в основном 4 параметра, с которыми я могу играть, чтобы получить правильный круг, который я желаю.opencv HoughCircle and trackbar

Так что мне кажется, что я хочу создать трек-лист для контроля состояния обрабатываемого изображения.

Так что я изменил мой код, как этот

#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; 
} 

Как видно на функции Хаф круге, я использовал int param1; в качестве значения я хочу изменить. Однако код не имеет синтаксических ошибок, но он не может быть скомпилирован. Я хотел бы знать, если что-то не так с моей установки TrackBar .. Спасибо

ответ

1

Здесь я попробовал его с помощью Python вы можете попытаться порт от него ...

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() 

Вы можете использовать вышеуказанный код в качестве вашего refrence, во-первых, он создает окно и трекболы для переключателя и два параметра для круга hough. , то в цикле while пара1 и para2 будет сохраняться положение трековых баров в качестве значения canny параметра. , тогда это используется в функции cv2.HoughCircles и круги нарисованы. изображение снова загружается, так что каждый раз, когда вы меняете параметр, вывод выводится на новое изображение, чтобы избежать путаницы.

надеюсь, что это может быть полезно.

Смежные вопросы