Soru sorLoop ile Resmi Güncellemek
murkoc tarafından 6 yıl önce soruldu

Merhaba,
Aşağıdaki kod bir resimdeki algılanan bir objenin kesilerek çoğaltılmasını sağlıyor. Bu komutla bunu sadece bir nesne için yapabiliyoruz. Ben bunu tekrarlayarak çoğaltmak istediğim nesneler tamamlanana kadar devam ettirmek istiyorum. Yani ilk baştaki resimdeki bir objeyi çoğaltıp bir sonraki nesne çoğaltılmış nesneli resim olacak ve bunun da üzerine ekleye ekleye çoğaltmak istediğim nesneler bitene kadar devam edeceğim. Bunu nasıl ekleyebilirim?  
% Get the dimensions of the image.
% numberOfColorBands should be = 1.
[rows columns numberOfColorBands] = size(grayImage);
% Display the original gray scale image.
subplot(2, 2, 1);
imshow(grayImage);
axis on;
title('Original Grayscale Image', 'FontSize', fontSize);
% Enlarge figure to full screen.
set(gcf, 'units','normalized','outerposition',[0 0 1 1]);
% Give a name to the title bar.
set(gcf,'name','Create an Object','numbertitle','off')
% Ask user to draw a box.
subplot(2, 2, 1);
promptMessage = sprintf('Drag out a box that you want to copy,\nor Cancel to abort processing?');
titleBarCaption = 'Continue?';
button = questdlg(promptMessage, titleBarCaption, 'Continue', 'Cancel', 'Continue');
if strcmpi(button, 'Cancel')
return;
end
k = waitforbuttonpress;
point1 = get(gca,'CurrentPoint'); 
finalRect = rbbox; % return figure units
point2 = get(gca,'CurrentPoint'); % button up detected
point1 = point1(1,1:2); % extract x and y
point2 = point2(1,1:2);
p1 = min(point1,point2); % calculate locations
offset = abs(point1-point2); % and dimensions
% Find the coordinates of the box.
xCoords = [p1(1) p1(1)+offset(1) p1(1)+offset(1) p1(1) p1(1)];
yCoords = [p1(2) p1(2) p1(2)+offset(2) p1(2)+offset(2) p1(2)];
x1 = round(xCoords(1));
x2 = round(xCoords(2));
y1 = round(yCoords(5));
y2 = round(yCoords(3));
hold on
axis manual
plot(xCoords, yCoords, 'b-'); % redraw in dataspace units
% Display the cropped image.
croppedImage = grayImage(y1:y2,x1:x2);
subplot(2, 2, 3);
imshow(croppedImage);
axis on;
title('Region that you defined', 'FontSize', fontSize);
% Paste it onto the original image
[rows2 columns2] = size(croppedImage)
promptMessage = sprintf('Click on the upper left point where you want to paste it,\nor Cancel to abort processing?');
titleBarCaption = 'Continue?';
button = questdlg(promptMessage, titleBarCaption, 'Continue', 'Cancel', 'Continue');
if strcmpi(button, 'Cancel')
return;
end
[x, y] = ginput(1)
% Determine the pasting boundaries.
r1 = int32(y);
c1 = int32(x);
r2 = r1 + rows2 – 1;
r2 = min([r2 rows]);
c2 = c1 + columns2 – 1;
c2 = min([c2, columns]);
plot([c1 c2 c2 c1 c1], [r1 r1 r2 r2 r1], 'r-');
% Paste as much of croppedImage as will fit into the original image.
grayImage(r1:r2, c1:c2) = croppedImage(1:(r2-r1+1), 1:(c2-c1+1));
subplot(2, 2, 4);
imshow(grayImage);
axis on;
title('Cropped and duplicated object', 'FontSize', fontSize);

2 Cevap
hakkans Yönetici tarafından 6 yıl önce cevaplandı

Merhaba,
Anladığım kadarıyla kodunuzda bir görsel arayüz var ve burada işlemi iptal etme seçeneği için bir Cancel tuşu da var. Kullanıcı bu butona basmadığı müddetçe programın aynı döngüyü tekrar çalıştırmasını sağlayabilirsiniz. Gerekli komutları tam olarak bilmiyorum ama kast ettiğimi genel hatlarıyla anlatmaya çalışayım. Örneğin kodunuzda

if strcmpi(button, ‘Cancel’)
return;
end

böyle bir kısım var ve burada galiba Cancel butonuna basıldıysa kodun geri kalan kısmının çalışmasına engel olarak geri dönmesini sağlıyorsunuz. Benim önerdiğim şey:

while (Cancel butonu basılmadığı sürece)
      %Tekrar etmesini istediğiniz işlemler
end

Butonların genelde property denen özellikleri olur. Örneğin button.IsOn() gibi bir özellik bulunabilir. Burada button nesnesine bağlı IsOn() isimli bir fonksiyon olduğunu varsayıyoruz, bu fonksiyon da 1 ya da 0 gibi bir değer döndürür basılma durumuna göre. Bunu while döngüsünün dönmesi için bir şart olarak tanımlarsanız Cancel butonuna basılmadığı sürece döngü devam edecektir.

murkoc tarafından 6 yıl önce cevaplandı

Kod resmi sectikten sonra kare şeklinde bir kesit alıp o bölgeyi başka bir yere kopyalıyor. Maalesef o noktadan döngü almayı ben de düşündüm ancak işe yaramadı. Bu kod parçası tüm kodun bir kısmı. İşlemler bittikten sonra kopyalama istenip istenmediğini soruyor evet deyince kopyalama yaptırıyor. Yani benim bu kod parcasının tamamını döngüye sokmam lazım. Sanırım gui de buton ataması yaparak çözülür bunu deniycem. Teşekkürler