for loop dögüleri

sanane2
11-03-2015, 19:04   |  #1  
OP Taze Üye
Teşekkür Sayısı: 0
3 mesaj
Kayıt Tarihi:Kayıt: Mar 2015

Arkadaşlar Merhaba Forumda yeniyim bir çalışmam var yapabildiğim kadar yaptım bir yerde takıldım yardım ederseniz sevinirim

Benim elimde bir resim var Resmin içinde eğriler var ve ben her eğrinin üstünden 3 nokta almak istiyordum ve bunun için yarıçapı farklı 3 çember (hayali olarak) çizdirdim Fakat eğrilerin arasında bazen boşluklar olabiliyor bu yüzden ben çemberin tam sağlandığı değil de 1 , 2 pksel taştığı noktaları da aldım daha sonra da elimde ardışık ihtiyacımdan fazla nokta oldu Bende ardışık noktaları silmek için(çünkü sadece her eğri üstünden 3 nokta almalıyım) gördüğün if li yapıları ve sayaçları kurdum Böylelikle tam istediğim şey oldu ve toplamda 21 nokta elde etmiş oldum Paintten kontrol ettim her şey doğru 
Şimdi yapmam gereken şey ise hangi noktalar aynı eğri üzerinde bulup 3 lü halde kaydetmeliyim Bunun sağlanması için seçlen üç noktanın bir çember denklemi oluşturması ve bu denklemi (resmin merkezi olan) 180 180 ni sağlanması gerekiyor

Kodda geldiğim yere kadar olan ksım burada 

[ Tüm kodu seç ] [ Yeni Pencerede Göster ]
#include <iostream> #include <iostream> #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/contrib/contrib.hpp" #include <vector> #include <stdio.h> #include <algorithm> using namespace std; using namespace cv; struct Koordinat { int x; int y; }; int main() { int const r1 = 50, r2 = 73, r3 = 15; std::vector<Koordinat> cember1, cember2, cember3; Mat image = imread("C:\\OpenCv2.4.6\\6.png"); int ikiBoyutKarsilastirDizi[100][2] = {}; int atlananKoordinatlar[100][2] = {}; cv::Vec3b pixelColor(255, 255, 0); //circle( image, Point( 385, 385 ), 100.0, Scalar( 0, 0, 255 ), 1, 8 ); //circle(image, Point(385, 385), 100, Scalar(255, 0, 0), 1, 8, 0); Vec3b color2 = image.at<Vec3b>(Point(394, 378)); for (int i = 0; i < image.cols; ++i) { // row la sütunun yeri yanlış olduğu için hesaplamalar yanlıs çıkıyor... for (int j = 0; j < image.rows; ++j) { Vec3b intensity = image.at<Vec3b>(j, i); uchar blue = intensity.val[0]; uchar green = intensity.val[1]; uchar red = intensity.val[2]; //int b = int(image.at<cv::Vec3b>(i, j)[0]); //int g = int(image.at<cv::Vec3b>(i, j)[1]); //int r = int(image.at<cv::Vec3b>(i, j)[2]); int x = 385, y = 385; int cember_denklemi1; int cember_denklemi2; int cember_denklemi3; //float cember_denklemi1, cember_denklemi2, cember_denklemi3; ///**/ //cember_denklemi1 = sqrt((i - x)*(i - x) + (j - y)*(j - y) - (r1*r1)); //cember_denklemi2 = sqrt((i - x)*(i - x) + (j - y)*(j - y) - (r2*r2)); //cember_denklemi3 = sqrt((i - x)*(i - x) + (j - y)*(j - y) - (r3*r3)); cember_denklemi1 = (i - x)*(i - x) + (j - y)*(j - y) - (r1*r1); cember_denklemi2 = (i - x)*(i - x) + (j - y)*(j - y) - (r2*r2); cember_denklemi3 = (i - x)*(i - x) + (j - y)*(j - y) - (r3*r3); int sayac = 0; if (cember_denklemi1 >=0 && cember_denklemi1 <=300&&(blue&&red&&green>0)) { image.at<Vec3b>(Point(i, j)) = pixelColor; //Vec3b color = image.at<Vec3b>(Point(i, j)); cout << "gelen koordinat : " << i << " " << j << endl; if (ikiBoyutKarsilastirDizi[0][0] == 0) //eğer dizinin içi boş ise vektörü ata. i ve j yi göster. { ikiBoyutKarsilastirDizi[0][0] = i; ikiBoyutKarsilastirDizi[0][1] = j; cout << "KIRMIZI" << i << " " << j << endl; // image.at<Vec3b>(Point(i, j)) = color2; } else { for (int z = 0; z<100; z++)//dizinin büyüklüğü 100 olduğu için. { if (ikiBoyutKarsilastirDizi[z][0] != 0 && ikiBoyutKarsilastirDizi[z][1] != 0) { /* 287 365 yüzünden and or oldu */if (abs(ikiBoyutKarsilastirDizi[z][0] - i) >= 5 "" abs(ikiBoyutKarsilastirDizi[z][1] - j) >= 5) // eğer daha önce diziye atanmış vektörün x ve y'si yeni eklenmeye çalışan vektörün x ve y' sinden 5 fazla yada eksik mi kontrolü. abs'ın amacı -3 yada -2 çıkma durumunda olayı kurtarmak. { sayac = z; } else { sayac = -1; break; } } } if (sayac != -1) { ikiBoyutKarsilastirDizi[sayac + 1][0] = i; ikiBoyutKarsilastirDizi[sayac + 1][1] = j; cout << "KIRMIZI" << i << " " << j << endl; } else //atlanan koordinat buraya düşecek. { cout << "atlanan koordinat: " <<i << " " << j << endl; } } } int sayac2=0; if (cember_denklemi2 >=0 && cember_denklemi2 <=300&&(blue&&red&&green>0)) { image.at<Vec3b>(Point(i, j)) = pixelColor; //Vec3b color = image.at<Vec3b>(Point(i, j)); cout << "gelen koordinat1 : " << i << " " << j << endl; if (ikiBoyutKarsilastirDizi[0][0] == 0) //eğer dizinin içi boş ise vektörü ata. i ve j yi göster. { ikiBoyutKarsilastirDizi[0][0] = i; ikiBoyutKarsilastirDizi[0][1] = j; cout << "BUYUK" << i << " " << j << endl; // image.at<Vec3b>(Point(i, j)) = color2; } else { for (int z = 0; z<100; z++)//dizinin büyüklüğü 100 olduğu için. {//0 0 geldiğinde 5 ten büyük gözüktüğü için dahil ediyor 0'lar için özel bir şey lazım. if (ikiBoyutKarsilastirDizi[z][0] != 0 && ikiBoyutKarsilastirDizi[z][1] != 0) // birinci yada ikinci değer 0 değilse aramaya devam et. { /* 287 365 yüzünden and or oldu */if (abs(ikiBoyutKarsilastirDizi[z][0] - i) >= 5 "" abs(ikiBoyutKarsilastirDizi[z][1] - j) >= 5) { sayac2 = z; } else { sayac2 = -1; break; } } } //bütün değerlerin kontrolü yapıldıktan sonra eleman eklenmeli ve gösterilmeli. if (sayac2 != -1) { ikiBoyutKarsilastirDizi[sayac2 + 1][0] = i; ikiBoyutKarsilastirDizi[sayac2 + 1][1] = j; cout << "BUYUK" << i << " " << j << endl; } else //atlanan koordinat buraya düşecek. { cout << "atlanan koordinat1: " <<i << " " << j << endl; } } } int sayac3=0; if (cember_denklemi3 >=0 && cember_denklemi3 <=300&&(blue&&red&&green>0)) { image.at<Vec3b>(Point(i, j)) = pixelColor; //Vec3b color = image.at<Vec3b>(Point(i, j)); cout << "gelen koordinat2 : " << i << " " << j << endl; if (ikiBoyutKarsilastirDizi[0][0] == 0) //eğer dizinin içi boş ise vektörü ata. i ve j yi göster. { ikiBoyutKarsilastirDizi[0][0] = i; ikiBoyutKarsilastirDizi[0][1] = j; cout << "KUCUK" << i << " " << j << endl; // image.at<Vec3b>(Point(i, j)) = color2; } else //dizinin ilk elemanı atanmış ise karşılaştırma yap 5 fark kuralına uygunsa diziye ekle, uygun değilse vektörü atla. Atladıysan vektörü gösterme atlamadıysan vektörü göster. { for (int z = 0; z<100; z++)//dizinin büyüklüğü 100 olduğu için. {//0 0 geldiğinde 5 ten büyük gözüktüğü için dahil ediyor 0'lar için özel bir şey lazım. if (ikiBoyutKarsilastirDizi[z][0] != 0 && ikiBoyutKarsilastirDizi[z][1] != 0) // birinci yada ikinci değer 0 değilse aramaya devam et. { /* 287 365 yüzünden and or oldu */if (abs(ikiBoyutKarsilastirDizi[z][0] - i) >= 5 "" abs(ikiBoyutKarsilastirDizi[z][1] - j) >= 5) // eğer daha önce diziye atanmış vektörün x ve y'si yeni eklenmeye çalışan vektörün x ve y' sinden 5 fazla yada eksik mi kontrolü. abs'ın amacı -3 yada -2 çıkma durumunda olayı kurtarmak. {// Doğruysa,atlamadığımız için karşılaştırma dizisine ata,göster. //sürekli olarak 1'e yada 0 a kaydediyor dizideki ilk 0 indisini bul demek lazım.iptal kontrolü dışarı çıkar. sayac3 = z; } else { sayac3 = -1; break; } } } //bütün değerlerin kontrolü yapıldıktan sonra eleman eklenmeli ve gösterilmeli. if (sayac3 != -1) { ikiBoyutKarsilastirDizi[sayac3 + 1][0] = i; ikiBoyutKarsilastirDizi[sayac3 + 1][1] = j; cout << "KUCUK" << i << " " << j << endl; } else //atlanan koordinat buraya düşecek. { cout << "atlanan koordinat2: " <<i << " " << j << endl; } } } } } imshow("Image", image); int k = waitKey(); imwrite("5.jpg", image); //waitKey( 0 ); return(0); }